0

我正在使用基于 innoDB 的数据库。我如何使用事务来保存数据。

我有一组用户。但只保存数据库中的最后一条记录。我不能使用 saveAll,因为我必须将数据保存在多个表中,而且它们都是相互关联的。

我什至无法定义模型关联船,因为我的数据库中有大量条目。所以每次加入都会执行。

请建议我如何使用交易概念?

4

1 回答 1

3

所有事务都在当前 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()的包装器- 它会根据模型关联的类型选择使用哪种方法。

阅读蛋糕书,那里有很好的解释......

于 2012-07-04T07:25:45.137 回答