0

有没有办法在调用动作CDbConnection时添加动作rollback

我有这段代码,它可以工作:

$transaction = $model->dbConnection->beginTransaction();

try {
    //...
    //doing some manipulations
    //...

    if($model->save()) {
        $transaction->commit();
        $this->redirect(array('view','id'=>$model->id));
    }

} catch(Exception $e) {
    $transaction->rollback();
    throw $e;
}

有没有办法恢复$transaction->rollback();调用时所做的操作而不将此代码放入catch语句中,例如在事务回滚函数上添加事件。

也许Behaviors 和 Events有一种解决方法,但我不确定它是如何工作的。

谢谢!

编辑-我想做的是:

当模型保存失败时,数据库会回滚,但我也在对文件进行一些操作(在验证和保存模型之前我需要这样做),所以如果模型因为以下原因而无法保存验证后,我需要将这些更改还原到文件中。

4

1 回答 1

1

目前 CDbTransaction 没有定义任何事件。

我要做的是创建一个类,该类将以您可以重用的方式处理此逻辑:

//protected/components/AtomicTransformation.php
<?php
class AtomicTransformation {
  private $_model;
  private $_transaction;
  public function __contruct(CModel $model)
  {
    $this->_model = $model;
    $this->_transaction = $model->dbConnection->beginTransaction();
  }
  public function commit()
  {
    $this->_transaction->commit();
  }
  public function rollback( /* pass any params you need for your revert logic */)
  {
    // Do your revert logic here
    $this->_transaction->rollback();
  }
}

$transformation = new AtomicTransformation($model);

try {
    //...
    //doing some manipulations
    //...

    if($model->save()) {
        $transformation->commit();
        $this->redirect(array('view','id'=>$model->id));
    }

} catch(Exception $e) {
    $transformation->rollback( /*your params */ );
    throw $e;
}
于 2013-01-16T18:46:41.317 回答