Yii在事务回滚上添加操作

时间:2013-01-16 18:16:15

标签: php yii rollback

在调用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语句中,就像在事务回滚函数上添加事件一样。

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

谢谢!

编辑 - 我想要做的是:

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

1 个答案:

答案 0 :(得分: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;
}