laravel框架的DB::rollback()

发布于 2022-09-02 21:00:46 字数 460 浏览 12 评论 0

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(),并没有回滚成功,有人在工作中遇到过这种状况嘛??

求分享啊,,,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

擦肩而过的背影 2022-09-09 21:00:46

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 ,这个我就不清楚了。

星軌x 2022-09-09 21:00:46

你要先打开事务啊

与往事干杯 2022-09-09 21:00:46

两种可能。

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文