如何使用交易的Yii事件(How to use transactions in Yii event)

2019-09-30 08:18发布

我知道, 如何在纯粹的DAO使用的交易或加载ActiveModel ,其中交易被调用之前发起$model->save()和回滚在任何异常。

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

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

    return parent::beforeDelete();
}

如果我有开始交易,捕捉可能的异常,并在其上回滚整个事务,那么只有关系模型(这里的菜单项)的删除将被回滚。 它不会阻止主记录(回滚)删除。

并防止主记录的缺失,通过返回FALSE在自己的beforeDelete异常的情况下,就是我要在这里照顾? 或者我应该避免交易在所有Yii中的事件?

Answer 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;
}


Answer 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;
    }
}

这两个答案似乎是正确的,两者相互替代。 虽然,我接受亚历克斯的答案,更好。



文章来源: How to use transactions in Yii event