我知道,how to use transactions in pure DAO或ActiveModel,在调用$model->save()
之前启动事务并在任何异常时回滚。
但如何使用交易,如果我可以访问的唯一代码位置(无论是什么原因)是Yii event?
public function beforeDelete()
{
foreach($this->menuItems as $menuItem) $menuItem->delete();
return parent::beforeDelete();
}
如果我在那里启动事务,捕获可能的异常并在其上回滚整个事务,那么将仅回滚关系模型(此处:菜单项)的删除。它不会阻止(回滚)删除主记录。
在异常的情况下,通过在我自己的FALSE
中返回beforeDelete
来阻止删除主记录是否需要在此处注意?或者我应该在Yii事件中完全避免交易吗?
答案 0 :(得分:2)
用示例代码回答我自己的问题,以进一步扩展我对 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;
}
}
两个答案似乎都是正确的,两者都是彼此的替代品。虽然,我接受亚历克斯回答,更好。
答案 1 :(得分:1)
覆盖保存方法怎么样:
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;
}