我知道, 如何在纯粹的DAO使用的交易或加载ActiveModel ,其中交易被调用之前发起$model->save()
和回滚在任何异常。
但是,如何使用事务,如果代码是唯一的地方,我可以访问(不管,为什么)是Yii的事件 ?
public function beforeDelete()
{
foreach($this->menuItems as $menuItem) $menuItem->delete();
return parent::beforeDelete();
}
如果我有开始交易,捕捉可能的异常,并在其上回滚整个事务,那么只有关系模型(这里的菜单项)的删除将被回滚。 它不会阻止主记录(回滚)删除。
并防止主记录的缺失,通过返回FALSE
在自己的beforeDelete
异常的情况下,就是我要在这里照顾? 或者我应该避免交易在所有Yii中的事件?
怎么样覆盖保存方法:
public function save($runValidation=true,$attributes=null)
{
$transaction=$this->getDbConnection()->beginTransaction();
try
{
$result = parent::save($runValidation,$attributes);
if($result)
$transaction->commit();
else
$transaction->rollback();
}
catch(Exception $e)
{
$transaction->rollback();
$result = false;
}
return $result;
}
回答我自己的例子的代码问题进一步扩大授予Alex的答案我的评论:
public function beforeDelete()
{
$transaction = $this->getDbConnection()->beginTransaction();
try
{
foreach($this->menuItems as $menuItem) $menuItem->delete();
$transaction->commit();
return parent::beforeDelete();
}
catch(Exception $ex)
{
$transaction->rollback();
return FALSE;
}
}
这两个答案似乎是正确的,两者相互替代。 虽然,我接受亚历克斯的答案,更好。