如何在Yii事件中使用事务

时间:2014-07-01 11:56:18

标签: yii transactions yii-events

我知道,how to use transactions in pure DAOActiveModel,在调用$model->save()之前启动事务并在任何异常时回滚。

但如何使用交易,如果我可以访问的唯一代码位置(无论是什么原因)是Yii event

public function beforeDelete()
{
    foreach($this->menuItems as $menuItem) $menuItem->delete();

    return parent::beforeDelete();
}

如果我在那里启动事务,捕获可能的异常并在其上回滚整个事务,那么将仅回滚关系模型(此处:菜单项)的删除。它不会阻止(回滚)删除主记录。

在异常的情况下,通过在我自己的FALSE中返回beforeDelete来阻止删除主记录是否需要在此处注意?或者我应该在Yii事件中完全避免交易吗?

2 个答案:

答案 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;
}