【发布时间】:2015-10-31 19:45:13
【问题描述】:
我有一个代码块,其中完成了多个表数据库操作。我需要将此代码块保留在事务中。我正在 cakephp 3 中尝试以下方式。
$saveStatus = 1;
$conn = ConnectionManager::get('default');
$conn->begin();
$tableArticles = TableRegistry::get('Articles');
$tableUsers = TableRegistry::get('Users');
$articlesEntity = $tableArticles->newEntities($categoriesArray);
foreach ($articlesEntity as $entity) {
if(!$tableArticles->save($entity))
{
$saveStatus = 0;
}
}
$usersEntity = $tableUsers->newEntities($usersArray);
foreach ($usersEntity as $entity) {
if(!$tableUsers->save($entity))
{
$saveStatus = 0;
}
}
if($saveStatus ==1)
{
$conn->commit();
}
else
{
$conn->rollback();
}
但事务只适用于一个表。我希望多表操作应该在事务中。
在蛋糕 2 中,我们使用 begin() 和 commit() 对每个模型数据源进行事务处理,如下所示。
$mealOptionDataSource = $this->MealOptionFood->getDataSource ();
$foodExtrasDataSource = $this->FoodExtras->getDataSource ();
$complexOptionDataSource = $this->ComplexOptionFood->getDataSource ();
$mealOptionDataSource->begin ();
$foodExtrasDataSource->begin ();
--- Code here---
$mealOptionDataSource->commit ();
$foodExtrasDataSource->commit ();
$complexOptionDataSource->commit ();
我在蛋糕 3 中找不到方法。
提前致谢。
【问题讨论】:
-
"不起作用" 不是正确的问题描述!请更具体地说明发生了什么/问题是什么。另请提及您迄今为止为调试问题所做的尝试。
-
看起来应该可以。您是否有 SQL 输出来显示正在发生的事情? (我假设这两个表都在同一个数据库中,并且该数据库是“默认”连接引用的数据库,并且相关数据库引擎支持事务。)
-
另外,可能与您的问题无关,但您可能想查看 Cake 连接的“事务”功能。它可以通过将您的插入包装在一个函数中来简化您的代码,如果您想回滚它们,您只需返回
false。
标签: php cakephp transactions cakephp-3.0