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

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

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

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

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

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

相关推荐
隔窗听雨眠5 小时前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
三8446 小时前
PHP Session 反序列化(2):漏洞根因 —— 序列化处理器错位与对象注入
android·web安全·php·反序列化·session
呆萌很6 小时前
MySQL 8.4 LTS 完整安装教程
数据库·mysql
秦老师Q6 小时前
php零基础入门到实战,从语法到框架,一篇搞定
开发语言·php
后台模板学习8 小时前
2026最新面试真题:到达用英语怎么说背后的逻辑与源码剖析
面试·职场和发展·php
Thomas21439 小时前
mysql 索引面试复习
数据库·mysql·面试
小袁拒绝摆烂10 小时前
一条 SQL 从 30 秒到 300 毫秒:聊聊 MySQL 的 Hash Join
sql·mysql·哈希算法
少陽君10 小时前
Python 并发编程:IO 等待用线程/asyncio,CPU 计算才用进程
数据库·python·php
敲代码的嘎仔11 小时前
自己设计了一个兑换码算法:自增ID + Base32转码 + 按位加权签名 + 异或混淆,面试被追问细节时终于不用慌了
java·数据库·mysql·算法·微服务·面试·职场和发展