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

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

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

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

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

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

相关推荐
ClouGence1 小时前
最基础的异构数据库 DDL 同步,我们踩过哪些坑?
数据库·mysql·postgresql
小呆爱发呆3 小时前
第三章 MySQL 库表操作
数据库·mysql·adb
普通人64 小时前
MySQL_FIND_IN_SET函数详解
android·数据库·mysql
真上帝的左手4 小时前
4. 关系型数据库-MySQL-Canal 进阶
数据库·mysql·canal
codeejun5 小时前
每日一Go·MySQL-14、慢 SQL 产生原因全解
sql·mysql·golang
星恒随风1 天前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
Pniubi1 天前
MySQL靠什么实现事务的?事务隔离级别有哪些?
java·数据库·mysql
aiks_yuan1 天前
MySQL 死锁怎么排查:看懂 INNODB STATUS 死锁日志,先查后插为什么必死锁(MySQL 8.2 实测)
mysql
xbzb1 天前
从零容器化部署 ECShop:Harbor 私有仓库 + 自定义 PHP 镜像 + LNMP 三容器
容器·php·harbor·镜像·仓库·ecshop
进击的荆棘1 天前
MySQL——库的操作
数据库·mysql