CakePHP支持多个模型上的事务吗?

CakePHP支持多个模型上的事务吗?,cakephp,transactions,cakephp-model,Cakephp,Transactions,Cakephp Model,我正在编写一个支持多个度量单位的应用程序。在罕见的情况下,用户希望更改他们的测量系统,我需要运行一个查询,该查询应用一个乘数来将应用程序中的每个单位列缩放到正确的测量系统。为了确保在该操作出错时所有数据保持正常,我需要在事务中运行查询 在Cake中是否可以执行包含多个模型的查询的事务 到目前为止,我所发现的是,它只支持针对单个模型的查询。是的,它支持。我在我的应用程序模型中有这样的功能,可以简化交易 然后你可以这样做: $saved = true; $this->transaction(

我正在编写一个支持多个度量单位的应用程序。在罕见的情况下,用户希望更改他们的测量系统,我需要运行一个查询,该查询应用一个乘数来将应用程序中的每个单位列缩放到正确的测量系统。为了确保在该操作出错时所有数据保持正常,我需要在事务中运行查询

在Cake中是否可以执行包含多个模型的查询的事务


到目前为止,我所发现的是,它只支持针对单个模型的查询。

是的,它支持。我在我的应用程序模型中有这样的功能,可以简化交易

然后你可以这样做:

$saved = true;
$this->transaction();
$saved = $saved && $this->save($data);
$saved = $saved && $this->SomeOtherModel->save($data2);
$saved = $saved && $this->AnotherModel->save($data3);

if($saved){
$this->transaction(true);
    return $this->id;
}
$this->transaction(false);
return false;
您还可以执行以下更复杂的操作:

function save1(){

    $saved = true;
    $this->transaction();
    $saved = $saved && $this->save($data);
    $saved = $saved && $this->save2($data);


    if($saved){
        $this->transaction(true);
        return $this->id;
    }

    $this->transaction(false);
    return false;
}
cake不支持嵌套事务,但您可以对它们进行某种伪装

//如果直接调用它,它将使用事务,但允许调用方法

//创建和管理事务。

function save2($data){
    $saved = true;
    $transaction = $this->transaction(); // will only be true if not already started
    $saved = $saved && $this->save($data);

    if($transaction){ // if it was started here, finish it
        if($saved){
            $this->transaction(true);
            return true;
        }

        $this->transaction(false);
        return false;
    }

    return $saved; // return just the status so the other model will finish the transaction
}

为了清楚起见,您可以执行类似ClassRegistry::init('SomeRandomModel')->save2()的操作。交易不限于当前模型或相关模型。这适用于任何型号。

可能与Ugh重复,你说得对。同样是一个基本问题,显然,从缺乏合适的答案来看,没有解决方案。如果你想保存几个相关的模型,你可以使用saveAll()方法。。我很幸运,在用户帐户的模型下,它们都链接在一起,但我希望在数据库服务器上进行更新(更新集字段=字段*10),而不是拉取数据、执行乘法应用程序端,然后将结果推回。这迫使我使用Model::query()方法,因此saveAll被取消。我想知道我是否能够在父模型上启动和停止事务,并实现期望的结果。。我会检查一下。好消息-如果它都在同一个父模型下,那么查询序列工作正常。现在都修好了;只需要整理一下这些问题的重复状态。嗯,你说得对。我原以为DboSource::begin()函数正在执行一些特定于模型的操作,因为Dbo需要将模型作为参数,但显然它实际上并没有将其用于任何用途。dbo和行为中几乎所有的方法都将模型作为第一个参数。我认为分派调用的方法可以做到这一点,因此即使在不需要的时候,您也可以得到它。看,这实际上非常棒-这不是一个标准功能吗?它使蛋糕中的交易变得容易得多。
function save2($data){
    $saved = true;
    $transaction = $this->transaction(); // will only be true if not already started
    $saved = $saved && $this->save($data);

    if($transaction){ // if it was started here, finish it
        if($saved){
            $this->transaction(true);
            return true;
        }

        $this->transaction(false);
        return false;
    }

    return $saved; // return just the status so the other model will finish the transaction
}