【问题标题】:How to use transactions in Yii eventYii事件中如何使用事务
【发布时间】:2014-07-01 11:56:17
【问题描述】:

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

但是如何使用事务,如果我可以访问的唯一代码位置(不管,为什么)是Yii event

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

    return parent::beforeDelete();
}

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

如果出现异常,通过在我自己的beforeDelete 中返回FALSE 来防止删除主记录,我需要在这里注意吗?或者我应该在 Yii 事件中完全避免交易?

【问题讨论】:

    标签: yii transactions yii-events


    【解决方案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;
    }
    

    【讨论】:

    • 我接受您的回答作为替代。我自己的代码(仍然使用beforeDelete)与您的代码非常相似。我自己的问题的答案是(恕我直言)“是” - 防止删除主记录,通过在我自己的beforeDelete 中返回FALSE 以防出现异常(回滚事务后)似乎就是我需要的全部在这种情况下要小心。
    【解决方案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;
        }
    }
    

    两个答案似乎都是正确的,两者都可以相互替代。不过,我接受亚历克斯的回答更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-16
      • 2011-12-25
      • 1970-01-01
      相关资源
      最近更新 更多