在调用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有一种解决方法,但我不确定它是如何工作的。
谢谢!
编辑 - 我想要做的是:
当模型无法保存时,数据库会有回滚,但我也在对文件进行一些操作(我需要在验证和保存模型之前做),所以如果模型失败要保存,因为验证,我需要将这些更改还原为文件。
答案 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;
}