ThinkPHP 多表回滚无效

今天首次用到了多表回滚,遇到了一个坑。错误代码如下:

try{
    $Member = D("Member");
    $Member->startTrans();
    $member_condition['id'] = 11641;
    $member_data['id'] = 10000;
    $member_res = $Member->where($member_condition)->save($member_data);

    if ($member_res === 1) {
        try{
            $User = D("User");
            $User->startTrans();
            $user_condition['account'] = '111111';
            $user_data['username'] = "4324";
            $user_res = $User->where($user_condition)->save($user_data);
            if ($user_res === 1) {
                $User->commit();
                $Member->commit();
                echo "全部修改成功";
            }
            else {
                $User->rollback();
                $Member->rollback();
                echo "User表未受影响,全部回滚!";
            }
        }catch (Exception $e){
            $User->rollback();
            $Member->rollback();
            echo "User修改异常,全部回滚!";
        }
    }
    else {
        $Member->rollback();
        echo "Member表未受影响,回滚!";
    }
}catch (Exception $e){
    $Member->rollback();
    echo "Member修改异常!";
}

我的思路是对 MemberUser 分别开启事务,只要有一个表修改失败,那么就全部回滚。但事实确是开启了两个事务后,这两个事务都无法回滚。如果只开启一个事务,那么该事务是可以回滚的。在tp官方文档里面也没找到什么解释。解决方法如下所示:

try{
    $Model = M();
    $Model->startTrans();
    $member_condition['id'] = 11641;
    $member_data['id'] = 10000;
    $member_res = $Model->table('party_member')->where($member_condition)->save($member_data);

    $user_condition['account'] = '111111';
    $user_data['username'] = "4324";
    $user_res = $Model->table('party_user')->where($user_condition)->save($user_data);

    if ($member_res === 1 && $user_res === 1) {
        echo "commit";
        $Model->commit();
    }
    else{
        echo "rollback";
        $Model->rollback();
    }
}catch (Exception $e){
    echo "发生异常";
    $Model->rollback();
}

对于多表的事务处理,先用 M 函数实例化一个空对象,使用 table 方法进行多个表的操作,如果操作成功则提交,失败则回滚。

另外一点需要说明的是,在有些集成环境中MySQL默认的引擎是 MyISAM,若想提供事务支持,需将数据库引擎改为 InnoDB

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值