Php Yii添加事务回滚操作
调用Php Yii添加事务回滚操作,php,yii,rollback,Php,Yii,Rollback,调用rollback操作时,是否有方法将操作添加到CDbConnection 我有这个代码,它可以工作: $transaction = $model->dbConnection->beginTransaction(); try { //... //doing some manipulations //... if($model->save()) { $transaction->commit(); $thi
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()时,是否有方法恢复所做的操作调用code>时,不会将此代码放入catch
语句中,就像在事务回滚函数中添加事件一样
也许有一个解决办法,但我不确定它是如何工作的
谢谢
编辑-我想做的是:
当模型保存失败时,数据库将回滚,但我也在对文件进行一些操作(在验证和保存模型之前,我需要这样做),因此如果模型由于验证而无法保存,我需要将这些更改还原到文件。当前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;
}
//protected/components/AtomicTransformation.php
你到底想做什么?我已经编辑了我的问题。很好,我还没想到呢!