CakePHP 2.1.3中的事务使用

时间:2012-07-03 12:41:02

标签: cakephp-2.1

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

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

我甚至无法定义模型关联 - 因为我的数据库中有大量条目。所以每次加入都会表演。

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

1 个答案:

答案 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()在那里解释得非常好......