php - 如何将 begin-commit 事务放入 Controller : cakephp?

标签 php mysql cakephp

我正在开发一个将更新一些表的 Controller 。我可以从我的 Controller 调用我的模型,在模型函数中我可以开始并提交我的查询,它可以在发生错误时回滚。

这是我的示例:

Controller :

//update table when update button is clicked
    if (!empty($this->data)) {
        if ($this->Item->update($this->data)) {
            $this->Item->create();
            $this->redirect('/sample');
            return;
        } else {
            $this->set('data', $this->data);
        }
    }

型号:

function update($data)
{
    $this->begin($this);
    if(!parent::save($data)) {
        $this->rollback($this);
        return false;
    }

    $this->commit();
    return true;
}

现在一切正常。但我需要做的是在我的 Controller 中调用另一个模型,如“$this->”ANOTHER MODEL HERE“->update()”。如果任一模型事务出现问题,我需要进行回滚。我在想的是在两个模型调用成功后在我的 Controller 中提交。

很像这样:

CONTROLLER PHP:
  BEGIN TRANSACTION
    ->CALLS MODEL1
        IF(MODEL1 == ERROR){
             ROLLBACK
        }
    ->CALLS MODEL2
        IF(MODEL2 == ERROR){
             ROLLBACK
        }
   COMMIT WHEN NO PROBLEM IS ENCOUNTERED

那么是否可以在controller中进行commit呢?我只能在模型中做到这一点。提前致谢!

最佳答案

So is it possible to perform commit in controller? I am only able to do it in model.

是的,您可以在 Controller 内执行提交或回滚。您需要先从您的一个模型中获取数据源。在 Controller 代码中,只需引用您正在使用的模型之一(假设它们都在同一个数据库中):

$ds = $this->MyModelName->getdatasource();

然后您可以从 Controller 内开始、提交和回滚到该数据源。

$ds->begin();

// do stuff and save data to models

if($success)
{
    $ds->commit();
}
else
{
    $ds->rollback();
}

如果我放弃操作并重定向或在某个步骤中完成并重定向,我实际上在多个地方有回滚或提交。我这里只是举例说明。

在 Controller 中处理事务对我来说最有意义,因为 Controller 操作是事务边界在概念上真正存在的地方。交易的想法自然会跨越多个模型的更新。我一直在使用 postgres 作为 Cake 2.2 和 2.3 的后端数据库来做这件事,它在这里工作得很好。尽管我怀疑 YMMV 与其他数据库引擎。

关于php - 如何将 begin-commit 事务放入 Controller : cakephp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7523562/

相关文章:

php - 如何从一个表单将相关实体插入到具有自动递增主键的多个表中

php - 如何在 Underscores Wordpress 主题中创建第二个侧边栏?

php - 更新表单返回空白页

javascript - 想要从 cakephp 中部门下拉列表的 onchange 中选择用户?

php - 如何在 PHP 中的类之间传递变量而不扩展

php - Laravel 4 更新 slug

mysql - Amazon RDS - 使用用户凭证将 MySql 数据库从 EC2 迁移到 RDS

php - WAMP Mysqli 不工作而 Mysql 工作

php - Cakephp:插入tinyint字段时。仅获取 "0"或 "1"

mysql - CakePHP/MySQL 条件 AND/OR 结果输出 - 逻辑