【问题标题】:Yii add action on transaction rollbackYii 添加事务回滚操作
【发布时间】:2013-01-16 18:16:15
【问题描述】:

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

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

$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 有一个解决方法,但我不确定它是如何工作的。

谢谢!

编辑 - 我想做的是:

当模型保存失败时,数据库会回滚,但我也在对文件进行一些操作(在验证和保存模型之前我需要这样做),所以如果模型失败由于验证保存,我需要将这些更改恢复到文件。

【问题讨论】:

  • 你到底想做什么?
  • 我已经编辑了我的问题。

标签: php yii rollback


【解决方案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;
}

【讨论】:

  • 很好,我没想到!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
相关资源
最近更新 更多