我正在使用基于 innoDB 的数据库。我如何使用事务来保存数据。
我有一组用户。但只保存数据库中的最后一条记录。我不能使用 saveAll,因为我必须将数据保存在多个表中,而且它们都是相互关联的。
我什至无法定义模型关联船,因为我的数据库中有大量条目。所以每次加入都会执行。
请建议我如何使用交易概念?
我正在使用基于 innoDB 的数据库。我如何使用事务来保存数据。
我有一组用户。但只保存数据库中的最后一条记录。我不能使用 saveAll,因为我必须将数据保存在多个表中,而且它们都是相互关联的。
我什至无法定义模型关联船,因为我的数据库中有大量条目。所以每次加入都会执行。
请建议我如何使用交易概念?
所有事务都在当前 DataSource 对象上执行。
首先你需要得到它(在模型中):
$dataSrc = $this->getDataSource();
此方法返回当前绑定到模型的 DataSource 对象。
然后您可以使用DataSource 对象的方法来开始、提交或回滚事务:
$dataSrc->begin();
//Do something
if (/*Everything is nice?*/) {
$dataSrc->commit();
} else {
//Bad things have happened
$dataSrc->rollback();
}
当然,您必须实现自己的逻辑。从Cake 2.2 开始,您还可以进行真正的嵌套事务。根据维基百科,“嵌套交易”是:
当一个新事务由已经在现有事务中的指令启动时,就会发生嵌套事务。新事务被称为嵌套在现有事务中,因此该术语。嵌套事务在不同数据库中的实现方式不同。但是,它们的共同点是在最外层事务提交之前,任何不相关的事务都不会看到更改。这意味着内部事务中的提交不需要持久更新数据库。
当然,这一切都取决于您使用的数据库。MySQL InnoDB事务存储引擎确实支持事务。
针对此评论的另一项澄清:
是的,我在控制器中使用 $this->Model->saveAll($this->request->data, array('deep' => true)。这是在 foreach 循环下编写的。只有最后一条 foreach 记录将被保存到数据库中。- Arun Jain
$this->Model->saveAll();
不需要循环运行!它将“自动”为您管理事情。把它从循环中取出。此外,您的问题是关于事务,而不是使用 saveAll() 保存数据。Model::saveAll()只是saveMany()和saveAssociated()的包装器- 它会根据模型关联的类型选择使用哪种方法。
阅读蛋糕书,那里有很好的解释......