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

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

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

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

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

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

相关推荐
苏琢玉2 小时前
PHP 这次是真的火了,只不过火得有点吓人
php
花间相见2 小时前
【计算基础|MySQL11】事务与隔离级别
sql·mysql·adb·架构
eleven_4u3 小时前
MySQL引擎层是如何工作的
数据库·mysql
计算机毕设定制辅导-无忧学长4 小时前
《基于微信小程序的个人智能刷题助手的设计与实现》
java·spring boot·mysql·微信小程序·uniapp·个人智能刷题助手系统
geovindu4 小时前
sql:Managing Complex Joins and Subqueries in SQL using mysql 9.0
大数据·数据库·数据仓库·sql·mysql·数据库开发·数据库架构
小白跃升坊4 小时前
PHP2Shell:AI 两天挖出 9.2 分漏洞,让全球 70% 网站连夜打补丁
php·1panel·ai安全·漏洞披露
骑着蜗牛撵大象3274 小时前
字节序、TLV 到 netlink:Linux 网络消息的编解码全链路
linux·网络·php·etl·序列化·字节序·tlv
瑞克-桑切斯4 小时前
MySQL部署手册(5.7.20/8.0)
数据库·mysql
啵啵啵鱼5 小时前
九、JDBC 操作 MySQL 数据库
android·数据库·mysql
handonch5 小时前
MySQL → Kingbase PG模式 高频SQL替换清单
数据库·mysql·postgresql