laravel框架的DB::rollback()

DB::beginTransaction();
try
{

//数据库
insert into TableA;
update TableB;
if(true) {
   throw new \Exception('ErrMsg');
}   

} catch(Exception $e) {

DB::rollback();
//addLog 日志记录
return false;

} finally {

DB::commit();

}
return true;

现在发现一个问题,进入到catch模块的时候,日志记录下来了,然后tableA插入记录也插入进去了
貌似DB::rollback(),并没有回滚成功,有人在工作中遇到过这种状况嘛??

求分享啊,,,

阅读 6.3k
4 个回答

finally的作用 写个测试代码就知道了

try{
    throw new Exception("error");
}catch(\Exception $e){
    echo "this is catch \n";
    return 111;   //注意 :这里已经return了
} finally {
    echo "this is finally \n";
}

结果

this is catch 
this is finally 

很明显了, catch 里面 rollback 其实是运行了,然后 finally 里 也 commit
至于为什么 rollback 了还可以 commit ,这个我就不清楚了。

你要先打开事务啊

两种可能。

  • 确实 commit失败了,比如瞬间数据库连接出问题了。
  • 事务进行了嵌套。这个可以检查下,新版和旧版的laravel对嵌套的处理不一致。新版的是可能出问题的。

finally不管是程序正常执行还是有异常,在字节码层面都会把finally中的代码编译在正常和异常代码后面,所以有多少个catch,finally代码就会多编译多少次,并且return指令都是在finally中的代码执行完成后才执行!
需要注意的是如果 finally 里包含 return,那么会覆盖 try 或 catch 里的return。