tp3的事务回滚不起作用

前面部分:转载

1、Model中startTrans函数执行了commit函数
2、commit函数调用了\Db\Driver类中的commit函数
3、\Db\Driver类中的commit函数对私有变量transTimes 进行自减操作,而transTimes 初始值为0
4、\Db\Driver类rollback函数则判断transTimes > 0才进行回滚,startTrans==0才开启事务
问题:当第一次执行M()->startTrans()前;transTimes =0;M()->startTrans()执行完,transTimes =-1,不开启事务;执行数据操作失败回滚rollback();判断transTimes > 0为假,不执行回滚;


Model类
public function startTrans()//1、第一次执行
    {
        $this->commit();//问题代码,执行完以后\Db\Driver变量transTimes=-1
        $this->db->startTrans();//此函数里面逻辑transTimes==0才真正开启事务
        return;
    }


    /**
     * 提交事务
     * @access public
     * @return boolean
     */
    public function commit()
    {
        return $this->db->commit();//2、\Db\Driver->commit();
    }


\Db\Driver类
public function commit()
    {
        if ($this->transTimes == 1) {
            // 由嵌套事物的最外层进行提交
            $result = $this->_linkID->commit();
            $this->transTimes = 0;
            $this->transPdo = null;
            if (!$result) {
                $this->error();
                return false;
            }
        } else {
               //此处加判断$this->transTimes>0解决bug
                $this->transTimes--;//3、自减,此时transTimes=-1
        }
        return true;

    }


然后看了下tp3.2.3的版本的Driver类中的处理事务的commit()

/**
 * 事务回滚
 * @access public
 * @return boolean
 */
public function rollback() {
    if ($this->transTimes > 0) {
        $result = $this->_linkID->rollback();
        $this->transTimes = 0;
        if(!$result){
            $this->error();
            return false;
        }
    }
    return true;
}

已经可以实现,不存在旧版本的bug了

嵌套的没看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值