PHP事务异常后为什么数据还写进去了

最近排查一个订单后台的问题,程序明明已经开启事务,中间步骤报错后接口也返回失败,但数据库里还是留下了部分订单数据。刚开始以为是 MySQL 事务没有生效,继续顺着代码看才发现,真正的问题是异常被提前"吃掉"了。

原来的写法是在事务里调用多个业务方法,其中一个方法内部用了 try catch。发生异常以后,这个方法只记录了一条日志,然后直接返回 false,并没有继续抛出异常。外层代码没有判断返回值,仍然执行到了 commit,所以前面已经写入的订单、客户记录全部被正式提交。

后来把事务边界重新整理,真正负责提交和回滚的地方只保留一层。内部方法出现异常时不再自己结束流程,而是把异常继续抛给外层统一处理。外层捕获后执行 rollback,同时记录订单号、执行步骤和异常信息。对于必须通过返回值判断的业务,也明确判断失败结果,避免程序继续往下执行。

做订单、充值、库存、佣金这类涉及多张表的数据时,事务不能只看有没有写 beginTransaction 和 rollback。更关键的是程序发生错误以后,控制流程到底有没有真正走到回滚。很多"事务失效"并不是数据库的问题,而是异常处理把原来的执行链打断了。

#PHP开发 #MySQL事务 #后台系统 #程序排查

相关推荐
m0_3807438711 小时前
PHP7.3和7.2字符串功能有什么不同
开发语言·php
FYKJ_201011 小时前
SSM校园失物招领系统41452-计算机课程设计、毕业设计
java·vue.js·spring boot·python·mysql·typescript·spark
m0_3807438712 小时前
PHP 8.4的新语法怎么用才规范
开发语言·php
哭泣方源炼蛊12 小时前
正则表达式c++内容汇集
数据库·c++·mysql·正则表达式
不恋水的雨14 小时前
gbase中union all导致末尾多出空格的坑
数据库·sql·mysql
m0_3807438715 小时前
PHP 8.3 接口返回数据为空怎么排查
开发语言·php
念念不忘 必有回响16 小时前
MySQL 事务与隔离级别完全指南
数据库·mysql
lusklusklusk16 小时前
Sqlserver_Oracle_Mysql_Postgresql表_索引碎片或膨胀的知识点汇总
mysql·oracle·sqlserver
m0_3807438716 小时前
PHP7.0字符串在Docker怎么用
开发语言·php
LeoCrawls16 小时前
Python 读取 JSON 常见报错排查,附完整处理函数
python·json·php