php there is no active transaction,thinkphp3.2.5 - There is no active transaction问题

线上一段代码

try {

$uModel = M(‘Users‘);

$uModel->startTrans();

$userInfo = $uModel->where([‘user_id‘ => 3])->select();

throw new \Exception(‘操作失败‘);

} catch (\Exception $e) {

$uModel->rollback();

var_dump($e->getMessage());

}

提示信息:

There is no active transaction

FILE: /datas/www/fxk/ThinkPHP/Library/Think/Db/Driver.class.php(323)

#0 /datas/www/fxk/ThinkPHP/Library/Think/Db/Driver.class.php(323): PDO->rollBack()

#1 /datas/www/fxk/ThinkPHP/Library/Think/Model.class.php(1709): Think\Db\Driver->rollback()

#2 /datas/www/fxk/Application/Cron/Controller/TestController.class.php(19): Think\Model->rollback()

#3 [internal function]: Cron\Controller\TestController->run()

#4 /datas/www/fxk/ThinkPHP/Mode/Cron/App.class.php(212): call_user_func_array(Array, Array)

#5 /datas/www/fxk/ThinkPHP/Mode/Cron/App.class.php(99): Think\App::invokeAction(‘Test‘, ‘run‘)

#6 /datas/www/fxk/ThinkPHP/Mode/Cron/App.class.php(58): Think\App::exec()

#7 /datas/www/fxk/ThinkPHP/Library/Think/Think.class.php(136): Think\App::run()

#8 /datas/www/fxk/ThinkPHP/ThinkPHP.php(100): Think\Think::start()

#9 /datas/www/fxk/cron.php(11): require(‘/datas/www/fxk/...‘)

查看代码Driver.class.php 323

20200325153333289440.png

应该是$this->_linkID属性有问题,这个属性的定义是在initConnect方法,如下:

protected function initConnect($master = true)

{

// 开启事物时用同一个连接进行操作

if ($this->transPDO) {

return $this->transPDO;

}

if (!empty($this->config[‘deploy‘]))

// 采用分布式数据库

{

$this->_linkID = $this->multiConnect($master);

} else

// 默认单数据库

if (!$this->_linkID) {

$this->_linkID = $this->connect();

}

}

如果存在 transPDO直接返回,这个属性是那里来的,请看(其实就是_linkID,用来判定是否在事务中,避免事务嵌套):

public function startTrans()

{

$this->initConnect(true);

if (!$this->_linkID) {

return false;

}

//数据rollback 支持

if (0 == $this->transTimes) {

// 记录当前操作PDO

$this->transPdO = $this->_linkID;

$this->_linkID->beginTransaction();

\Think\Log::record(date(‘H:i:s ‘) . ‘begin;‘, ‘mysql‘);

}

$this->transTimes++;

return;

}

发现问题,开启事务时候赋值的是transPdo,而在initConnect里面判断是transPDO,这点很有问题,但是为什么会导致这个报错,返回到调试代码,我们把代码简化,去掉查询后,执行正常,那问题可能就在执行了select()

20200325153333674181.png

在select中的query方法,调用了initConnect初始化,串联起来原因就出来了:开启事务的时候初始化了句柄存在transPdo,中间调用Select方法,判断的是transPDO发现不存在,于是重新生成了一个句柄,这个句柄是没开启事务的,然后抛出一场时事务回滚就提示上面的错误信息了

原文:https://www.cnblogs.com/lanse1993/p/12566309.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值