2017-10-26 10:33:45 3010次浏览 2条回答 0 悬赏 200 金钱

Active Record情况下如何进行事务处理操作

最佳答案

  • johnny1991 发布于 2017-10-26 10:38 举报
    $transaction = Yii::$app->getDb()->beginTransaction();
    try {
        xxxx
    } catch (Exception $e) {
        $transaction->rollBack();
        throw $e;
    }
    $transaction->commit();
    return true;
    
    2 条回复
    回复于 2017-10-26 10:47 回复

    try里面使用多个AR保存,似乎不行哈,我需要保存4张表,A与B有关系,A与C有关系,C与D有关系,一旦一个表保存失败,全部回滚。怎么破

    回复于 2017-10-26 10:53 回复

    • 你要确保在这个try外面没有transaction
    • 失败是否有抛出异常并且被这里exception cache到
  • 回答于 2017-10-27 10:15 举报

    事务嵌套。不过看你说的是 如果一个表保存失败,全部回滚。也就不需要事务嵌套了。

    <?php
    $trans = Yii::$app->gtDb->beginTransaction();
    try{
        $A = A::find()->one();
        if(!$A->save()){
            throw new Yii\db\Exception('A表更新失败');
        }
        $B = B::find()->one();
        if(!$B->save()){
            throw new Yii\db\Exception('B表更新失败');
        }
        $C = C::find()->one();
        if(!$C->save()){
            throw new Yii\db\Exception('C表更新失败');
        }
        $D = D::find()->one();
        if(!$D->save()){
            throw new Yii\db\Exception('D表更新失败');
        }
    } catch (Yii\db\Excepton $e){
        $trans->rollBack();
        return $e->getMessage();
    }
    ?>
    
您需要登录后才可以回答。登录 | 立即注册
晦涩de咚
副董事长

晦涩de咚

注册时间:2015-08-03
最后登录:2020-09-04
在线时长:356小时20分
  • 粉丝36
  • 金钱13598
  • 威望340
  • 积分20558

热门问题