ThinkPHP 多表回滚无效

21人阅读 评论(0) 收藏 举报
分类:

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

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

查看评论

ThinkPHP框架入门到精通

-
  • 1970年01月01日 08:00

ThinkPHP数据回滚的使用简介

ThinkPHP数据回滚的使用简介
  • lvqingyao520
  • lvqingyao520
  • 2016-12-20 09:50:29
  • 674

Thinkphp中事物无效的原因

Thinkphp是支持多表事物的,但是这取决于数据库本身是否支持事物,如果数据库本身不支持事物那么即使代码中创建了事物也不起作用。 MySQL数据库只有Innodb和Bdb才能支持事务。所以捯饬半天发...
  • qiminghang
  • qiminghang
  • 2016-04-19 15:36:52
  • 669

Thinkphp 多表事务

在 Thinkphp 3.2.3 下测试通过。 Thinkphp 对事务的处理非常简单。单表事务只需使用 M 函数实例化一个数据表对象,如果操作成功则提交,失败则回滚;对多表的事务处理也非常简便。先用...
  • u013049553
  • u013049553
  • 2017-01-23 12:20:25
  • 2060

thinkphp curd的事务回滚 一看就会

/**       *thinkphp数据库的事务回滚例子       *这一般用在多表操作,比如: (1)订单表和其他订单关联信息,删除订单同时也要把订单关联表中的信息删掉,如果说删除了订单表结果...
  • qq1355541448
  • qq1355541448
  • 2014-06-19 10:30:08
  • 8858

tp3.2 多表事物

TP3.2 事物 TP3.2 默认开启夺标事物 public function testTrans(){ $Model = M('t1'); $Model->s...
  • pwjiferox
  • pwjiferox
  • 2018-01-28 18:22:52
  • 62

thinkphp3.2 多表事务的实例

多表事务不同于单表   1.  需要使用空白的Model 来开启以及使用事务 2.   如果不是在Model里面, 需要使用  $model->table() 来进行insert update del...
  • cominglately
  • cominglately
  • 2017-08-28 12:16:59
  • 796

SQL写了回滚无效 回滚没用

  • 2012年03月27日 11:58
  • 2KB
  • 下载

thinkphp对事务回滚的案例

首选innodb存储引擎才支持事务。 $table=M('table'); $table->startTrans();//开启事务 $table->commit();//成功则提交 ...
  • u010674395
  • u010674395
  • 2015-02-06 19:32:39
  • 1114

thinkphp 事物回滚

首先这个功能很简单就是申请提现,还没做到支付,只是直接双方数据一致而已; 为什么要使用事务? 在生活中肯定使用过支付宝提现,基本原理应该就是,当你申请提现后,对方数据库扣除相应金额,然后我...
  • qq_25504271
  • qq_25504271
  • 2017-03-05 15:24:31
  • 324
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 792
    排名: 6万+
    最新评论