前面部分:转载
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了
嵌套的没看