news 2026/5/2 6:28:47

mysql数据库死锁原因分析与预防_规范事务访问表的顺序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
mysql数据库死锁原因分析与预防_规范事务访问表的顺序

死锁主因是事务交叉更新表顺序不一致,而非并发高;须统一多表操作顺序、避免长事务与范围更新、慎用ON DUPLICATE KEY UPDATE,并通过SHOW ENGINE INNODB STATUS定位具体冲突。死锁不是并发太高,是事务交叉更新不同表的顺序不一致MySQL 死锁绝大多数时候和 QPS 无关,而是两个事务以相反顺序修改同一组表。比如事务 A 先 UPDATE users 再 UPDATE orders,事务 B 却先 UPDATE orders 再 UPDATE users——只要它们恰好在临界点卡住,InnoDB 就会选一个回滚,报出 Deadlock found when trying to get lock。这种场景在微服务里特别常见:用户服务和订单服务各自按自己逻辑写 SQL,没人协调访问顺序。用 SHOW ENGINE INNODB STATUS 查看最近死锁,重点看 *** (1) 和 *** (2) 两段里的 WAITING FOR THIS LOCK TO BE GRANTED 和 HOLDS THE LOCK(S),能直接看出哪两张表、哪几行被交叉持有业务代码里所有涉及多表更新的事务,必须约定全局统一的表访问顺序(例如:总是 users → orders → order_items)避免在事务里调用外部 HTTP 接口或执行耗时计算,否则会拉长锁持有时间,放大交叉概率唯一索引冲突 + INSERT … ON DUPLICATE KEY UPDATE 容易触发隐式锁升级这个组合看似安全,实则是死锁高发区。当两个事务同时对同一个 UNIQUE 字段做 INSERT ... ON DUPLICATE KEY UPDATE,InnoDB 会在唯一索引上加 GAP 锁+插入意向锁,再试图升级为记录锁——如果双方都卡在 GAP 锁阶段,又互相等待对方释放,就死锁了。检查表结构:确认冲突字段是否真需要 UNIQUE 约束;如果不是强业务要求,改用应用层幂等(如先 SELECT 再 INSERT)更可控如果必须用 ON DUPLICATE KEY UPDATE,确保 WHERE 条件走的是聚簇索引(主键),而不是二级唯一索引——后者更容易产生不可预测的 GAP 锁范围线上已出现该死锁时,临时降级方案是加 SELECT ... FOR UPDATE 显式锁住主键行,把冲突前置到读阶段,但要注意锁粒度和性能影响长事务 + 范围条件 UPDATE 是死锁温床UPDATE ... WHERE created_at > '2024-01-01' 这类语句,在未命中索引或索引区分度低时,可能锁住成百上千行,甚至整个索引区间。另一个事务若恰好更新其中某几行,就极易陷入死锁。用 EXPLAIN 确认该 UPDATE 是否走了预期索引;没走的话,优先优化索引,而不是加 FOR UPDATE 或拆事务避免在事务中执行范围大、耗时长的 UPDATE;可拆成小批量(如每次 100 行),用 WHERE id BETWEEN ? AND ? 配合主键定位,减少单次锁持有量监控 innodb_trx.trx_state = 'LOCK WAIT' 和 trx_started 时间,及时发现运行超 5 秒的锁等待事务READ COMMITTED 隔离级别不能避免死锁,但能减少锁数量有人以为换成 READ COMMITTED 就能绕过死锁,其实不然——死锁只和加锁顺序与资源竞争有关,和是否生成 MVCC 版本无关。但它确实能禁用 GAP 锁(除外键和唯一索引冲突场景),从而缩小锁覆盖范围。确认当前隔离级别:SELECT @@transaction_isolation;生产环境建议统一设为 READ COMMITTED,除非业务强依赖 REPEATABLE READ 的一致性快照语义即使用了 READ COMMITTED,UPDATE 仍会对匹配行加记录锁,多表交叉更新照样死锁不要为了“防死锁”而盲目调低隔离级别;真正有效的是控制事务长度、固化访问顺序、消除非必要范围锁死锁本身不可怕,可怕的是把它当成随机事件忽略。一旦出现,必须定位到具体哪两条 SQL、哪两张表、哪个索引字段在打架——日志里的 WAITING FOR THIS LOCK TO BE GRANTED 行,比任何监控指标都真实。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 6:26:45

别再手动写SQL了!用DB-GPT-Hub微调Llama3,让大模型帮你搞定复杂查询

别再手动写SQL了!用DB-GPT-Hub微调Llama3,让大模型帮你搞定复杂查询 每次面对跨表联查、嵌套子查询或多条件聚合时,你是否也曾在键盘前反复修改SQL语句?去年参与电商大促数据分析时,我曾为一句包含7张表关联的报表SQL调…

作者头像 李华
网站建设 2026/4/10 21:16:37

YOLO-Master 与 YOLO 开始赵

AI Agent 时代的沙箱需求 从 Copilot 到 Agent:执行能力的质变 在生成式 AI 的早期阶段,应用主要以“Copilot”形式存在,AI 仅作为辅助生成建议。然而,随着 AutoGPT、BabyAGI 以及 OpenAI Code Interpreter(现为 Adv…

作者头像 李华
网站建设 2026/4/10 21:15:09

碳交易机制下考虑需求响应的综合能源系统优化运行 综合能源系统是实现“双碳”目标的有效途径

碳交易机制下考虑需求响应的综合能源系统优化运行 综合能源系统是实现“双碳”目标的有效途径,为进一步挖掘其需求侧可调节潜力对碳减排的作用,提出了一种碳交易机制下考虑需求响应的综合能源系统优化运行模型。 首先,根据负荷响应特性将需求…

作者头像 李华
网站建设 2026/4/10 21:14:27

我好像会被 Agent 淘汰,我用数据算了一算仗

OCP原则 ocp指开闭原则,对扩展开放,对修改关闭。是七大原则中最基本的一个原则。 依赖倒置原则(DIP) 什么是依赖倒置原则 核心是面向接口编程、面向抽象编程, 不是面向具体编程。 依赖倒置原则的目的 降低耦合度&#…

作者头像 李华
网站建设 2026/4/10 21:12:09

【模拟IC】从指标到参数:二级运放GBW与相位裕度的设计实战

1. 理解GBW与相位裕度的工程意义 第一次接触运放设计时,看到GBW100MHz、PM>60这样的指标要求,就像拿到一张没有说明书的电路图。作为从业十年的模拟IC工程师,我至今记得当初面对这些抽象参数时的困惑。**增益带宽积(GBW)和相位裕度(PM)**本…

作者头像 李华
网站建设 2026/4/10 21:12:08

CSDN同步助手上线:一键同步技术文章到各大平台

CSDN 官方出品 | 永久免费 | 数据本地安全 | 30 秒极速安装作为技术创作者,你是否也有这样的烦恼?写完一篇技术博客,还要在微信公众号、微博、知乎等多个平台重复复制粘贴、重新排版,光是分发内容就要花费大量时间,严重…

作者头像 李华