1

我知道,如何在纯 DAOActiveModel中使用事务,其中事务在调用之前启动$model->save()并在任何异常时回滚。

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

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

    return parent::beforeDelete();
}

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

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

4

2 回答 2

2

覆盖保存方法怎么样:

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;
}
于 2014-07-01T12:50:40.297 回答
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;
    }
}

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

于 2014-07-01T13:40:47.130 回答