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

MySQL升级时如果遇到死锁怎么解决_分析日志与调整事务隔离

小明酱_4480

小明酱_4480

发布时间:2026-05-15 12:07:19

|

860人浏览过

|

来源于php中文网

原创

MySQL升级不直接引发死锁,但默认行为变化(如隔离级别、索引统计、锁策略)可能暴露原有事务逻辑中的死锁隐患;问题本质是旧代码与新版本语义不兼容。

mysql升级时如果遇到死锁怎么解决_分析日志与调整事务隔离

MySQL 升级本身不会直接引发死锁,但升级后默认行为变化(如隔离级别、索引统计、锁策略)可能暴露原有事务逻辑中的死锁隐患——问题不在升级动作,而在旧代码与新版本语义的不兼容。

怎么看 error log 里真正的死锁记录

升级后首次出现死锁,别急着改代码,先确认是不是真死锁、谁被回滚、锁了什么。InnoDB 只在 SHOW ENGINE INNODB STATUS 中保留**最近一次**死锁详情,日志里则可能被淹没:

  • 错误日志中搜索关键词:Deadlock found when trying to get lock,定位时间戳
  • 立刻执行:SHOW ENGINE INNODB STATUS\G,重点看 LATEST DETECTED DEADLOCK 区块
  • 注意其中两段 SQL 的 lock_mode X locks rec but not gap 或 lock_mode X locks gap before rec —— 这直接说明是行锁冲突还是间隙锁惹的祸
  • 对比升级前后 innodb_lock_wait_timeout 值(默认 50 秒),升级若重置为更短值(如 10),可能让原本“卡住”的事务更快报死锁而非等待超时

RR 隔离级别下间隙锁突然变多怎么办

MySQL 5.7 → 8.0 升级后,REPEATABLE READ 下间隙锁行为更严格,尤其对非唯一索引或范围查询。原来没索引的 WHERE status = 'pending',升级后可能因统计信息更新,触发全表扫描+大量间隙锁,和另一事务形成交叉等待。

MySQL
MySQL

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

下载
  • 检查死锁日志中涉及的 SQL 是否走了索引:用 EXPLAIN FORMAT=TRADITIONAL 对比升级前后执行计划
  • 如果 type 是 ALL 或 index,且 key 为 NULL,说明缺失索引 → 立即补上覆盖查询条件的索引
  • 对只查单值的场景,把普通索引改为 UNIQUE(哪怕业务上不强制唯一),可消除间隙锁(InnoDB 对唯一索引的等值查询只加记录锁)
  • 临时缓解:在事务内显式关闭间隙锁:SELECT ... FROM t WHERE ... LOCK IN SHARE MODE 改为 SELECT ... FROM t WHERE ... FOR UPDATE 并确保 where 条件走唯一索引

事务拆分后仍死锁?检查锁顺序一致性

升级后 ORM(如 MyBatis 3.4→3.5)可能改变 SQL 拼接顺序,导致原本按 ID 排序批量更新的语句,变成无序 ID 列表,使不同事务锁行顺序不一致。

  • 抓包或开启 general_log,确认两个并发事务实际执行的 SQL 中 WHERE id IN (…) 的 ID 顺序是否一致
  • 禁止 ORM 自动拼 IN 列表;应用层先 ORDER BY id 再生成参数,确保所有事务按相同物理顺序加锁
  • 对高频并发更新的热点行(如账户余额),用 SELECT ... FOR UPDATE ORDER BY id ASC 强制统一顺序,哪怕只更新一行也生效
  • 避免在事务中混合使用 UPDATE 和 INSERT ... ON DUPLICATE KEY UPDATE,后者在 RR 下可能隐式加间隙锁,与前者冲突

为什么重试机制在升级后失效了

MySQL 8.0.22+ 默认启用 innodb_deadlock_detect(无法关闭),但部分云厂商 RDS 在升级后重置了 innodb_rollback_on_timeout 为 OFF,导致锁等待超时后不自动 rollback,而是卡住直到客户端断连——此时看起来像“假死锁”。

  • 查当前值:SELECT @@innodb_rollback_on_timeout;,应为 ON
  • 若为 OFF,需在配置中显式设为 ON 并重启,否则应用层重试捕获不到 Deadlock found 错误码(1213),而收到的是连接中断或超时异常
  • 应用重试逻辑必须区分错误码:1205(死锁)可立即重试;1213(锁等待超时)应退避后重试,避免雪崩

真正难处理的不是死锁本身,而是升级后事务行为“变温和”了——比如原来全表锁直接阻塞,现在变成细粒度锁却频繁死锁。这时候盯着 SQL 执行计划和锁类型比调参数更管用。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

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

豆包大模型

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

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

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

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4383

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

911

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1149

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6301

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3123

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6280

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

8541

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1150

2024.04.29

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

80

2026.10.16

热门下载

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

精品课程

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

共1课时 | 188人学习

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

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