讲师中心 微信公众号
AI工具推荐 视频效率加速

如何排查MySQL事务频繁回滚的问题?

雨晨姑娘_3076

雨晨姑娘_3076

发布时间:2026-08-23 12:19:25

|

873人浏览过

|

来源于php中文网

原创

频繁回滚本质是系统暴露设计或配置缺陷,须从应用行为、锁竞争、undo积压三层面同步排查:查隐式回滚(如DDL触发提交)、定位死锁SQL组合、监控History list length>5000及iostat await>20ms和%util=100%确认purge滞后与IO瓶颈。

如何排查mysql事务频繁回滚的问题?

频繁回滚不是事务“出错了”,而是系统在持续暴露设计或配置缺陷——必须从应用行为、锁竞争、undo积压三个层面同步排查,单看错误日志或SHOW ENGINE INNODB STATUS只能看到表象。

查应用层是否在无意识触发隐式回滚

很多回滚根本没走ROLLBACK语句,而是被 MySQL 自动中断的。常见诱因包括:

  • 事务中执行了DROP TABLE、ALTER TABLE等 DDL 语句:InnoDB 遇到 DDL 会隐式提交当前事务,后续再出错就无法回滚整段逻辑
  • 超时未提交:连接空闲超wait_timeout(默认 28800 秒)或事务执行超innodb_lock_wait_timeout(默认 50 秒),MySQL 主动断连并回滚
  • 客户端异常断开(如 Python 进程 kill -9、PHP 脚本超时 exit),服务端检测到连接丢失后强制回滚
  • 存储过程中未定义DECLARE EXIT HANDLER FOR SQLEXCEPTION,导致 SQL 报错后过程退出但事务未显式回滚,依赖连接关闭时清理

验证方式:开启 general log(SET GLOBAL general_log = ON),复现一次高频回滚场景,直接搜rollback出现位置——如果它总在某条 DDL 或超时后出现,问题就在应用逻辑里。

定位死锁和锁等待引发的被动回滚

死锁不是“偶发”,而是访问模式固化后的必然结果。关键要确认是不是同一个 SQL 组合反复触发:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 检查错误日志里重复出现的Deadlock found when trying to get lock,注意对比TRANSACTION块中的query id和WAITING FOR THIS LOCK行——若多次死锁都涉及UPDATE t1 SET x=1 WHERE id = ?和UPDATE t2 SET y=2 WHERE id = ?,说明业务代码存在固定交叉更新顺序
  • SHOW ENGINE INNODB STATUS\G里的LATEST DETECTED DEADLOCK只保留最后一次,别指望它帮你回溯历史;必须确保innodb_print_all_deadlocks = ON且log_error路径可写,否则旧死锁记录全丢
  • 用SELECT * FROM performance_schema.data_lock_waits(MySQL 8.0.30+)实时抓取锁等待链,比翻日志更快定位阻塞源头

确认 undo 积压是否让小回滚变慢回滚

一个改了 10 行的事务回滚耗时 3 秒,大概率不是锁问题,而是 undo 日志处理卡住了:

  • 运行SHOW ENGINE INNODB STATUS\G,搜索History list length:值 > 5000 表示 purge 线程严重滞后,已提交事务的 undo 还堆在那没清理,新回滚要等 purge 让出空间
  • 查information_schema.INNODB_TRX里TRX_ROWS_MODIFIED低但TRX_STARTED很老的事务——这种“长睡不醒”的事务可能早该提交或回滚,却一直占着 rollback segment
  • 观察iostat -x 1输出:await持续 > 20ms 且%util == 100%,说明磁盘在疯狂读 undo 页,此时调高innodb_purge_threads(默认 4)比加内存更有效

区分“回滚失败”和“回滚被忽略”

有些场景下你以为回滚了,其实什么都没发生:

  • autocommit = 1(默认)时,每条语句都是独立事务,ROLLBACK对前一条已提交的UPDATE完全无效——必须先SET autocommit = 0或显式START TRANSACTION
  • 在存储过程中执行ROLLBACK但没加RESIGNAL,调用方收不到错误,误以为操作成功,实际数据已回退
  • 使用mysql_real_query()等 C API 时未检查返回值,SQL 报错后仍继续执行后续语句,最后mysql_rollback()只回滚了最后一段

真正难缠的不是回滚本身,而是那些既不报错、也不生效的“静默失效”——它们不会出现在死锁日志里,也不会推高 History list length,但会让业务数据在一致性边缘反复横跳。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2433

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

1459

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

875

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3432

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

5888

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

1259

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6151

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

5322

2023.08.14

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 193人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn