问题描述
开启两次事务,第一次事务未做任何操作,开启第一次事务,导致第二次事务任何操作未起任何作用。mysql隐式提交失效
public function a()
{
DB::beginTransaction();
//操作内容
$this->b();
DB::commit();
}
private function b()
{
DB::beginTransaction();
//操作内容
DB::commit();
}
问题分析
mysql层面:事务的隐式提交。
事务隐式提交:在mysql中第一次事务开始时,未做提交操作,开启了第二次事务,第一次事务会自动提交。
在数据库中测试隐式提交,事务正常执行,第二次事务正常执行。
数据库版本问题
尝试了5.6,5.5,8.0,9.0版本,事务的隐式提交也是存在的,并出现第二次事务未做任何处理。
Laravel底层对事务做了处理
文件路径:vendor\laravel\framework\src\Illuminate\Database\Concerns\ManagesTransactions.php
结论
翻开了laravel源码对嵌套事务的处理,beginTransaction开启这个事务这个方法中,对未做提交或未做回滚的代码做了一个计数,当transactions 这个事务计数器大于1时,源码对嵌套事务做了暴力处理,所有事务都不提交,导致后续事务无法提交,导致mysql中的隐式提交失效。