我正在使用基于innoDB的数据库。如何使用事务来保存数据。
我有一组用户。但只保存数据库中的最后一条记录。我不能使用saveAll,因为我必须将数据保存在多个表中,并且所有这些都是相互关联的。
我甚至无法定义模型关联 - 因为我的数据库中有大量条目。所以每次加入都会表演。
请建议我如何使用交易概念?
答案 0 :(得分:3)
所有事务都在当前的DataSource对象上执行。
首先你需要得到它(在模型中):
$dataSrc = $this->getDataSource();
This method返回当前绑定到Model的DataSource对象。
然后您可以使用DataSource Object's methods开始,提交或回滚transactions:
$dataSrc->begin();
//Do something
if (/*Everything is nice?*/) {
$dataSrc->commit();
} else {
//Bad things have happened
$dataSrc->rollback();
}
当然,你必须实现自己的逻辑。自Cake 2.2 you can also do real nested transactions以来。根据{{3}}的“嵌套交易”是:
当a启动新事务时,会发生嵌套事务 已存在于现有交易中的指令。新的 据说事务嵌套在现有事务中, 因此这个词。嵌套事务的实现方式不同 不同的数据库但是,他们的共同点是变化 直到最外面的任何不相关的交易都不可见 交易已经承诺。这意味着在内部提交 事务没有必要持久更新数据库。
当然,所有这些都取决于您正在使用的数据库。 Wikipedia确实支持交易。
对此评论的另一个澄清:
是的,我正在使用$ this-> Model-> saveAll($ this-> request-> data, 我的控制器中的数组('deep'=> true)。这是写在一个 foreach循环。只有最后一个foreach记录才会被保存 进入数据库。 - Arun Jain
$this->Model->saveAll();
不需要循环运行!它将“自动”为您管理事物。把它带出循环。
此外,您的问题是关于事务,而不是使用saveAll()保存数据。 MySQL InnoDB transactional storage engine只是Model::saveAll()和saveMany()的包装器 - 它将根据模型关联的类型选择使用哪种方法。
阅读saveAssociated()在那里解释得非常好......