mysql 8.0+唯一受支持的锁等待关系视图是performance_schema.data_lock_waits,它替代已废弃的innodb_lock_waits,需启用相关consumers和instruments,通过join innodb_trx补全事务sql与时间,并结合show engine innodb status验证死锁及锁细节。

MySQL 没有官方“锁图表工具”,所谓可视化锁依赖图,本质是靠人工拼接 INNODB_TRX、performance_schema.data_lock_waits(或已废弃的 INNODB_LOCK_WAITS)和 SHOW ENGINE INNODB STATUS 三处数据,再用逻辑还原出事务间的等待链。直接依赖图形界面工具容易误判,尤其在 MySQL 8.0.24+ 环境下。
查 performance_schema.data_lock_waits 得到等待对
这是当前唯一受支持的锁等待关系视图,替代了旧版 INNODB_LOCK_WAITS。它只返回瞬时快照,且要求 performance_schema 开启、相关 consumers 已启用:
UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE 'events%lock%';SELECT BLOCKING_ENGINE_TRANSACTION_ID, BLOCKING_TRX_ID, REQUESTING_ENGINE_TRANSACTION_ID, REQUESTING_TRX_ID FROM performance_schema.data_lock_waits;- 注意字段名变化:
BLOCKING_TRX_ID对应阻塞方,REQUESTING_TRX_ID是等待方;旧版的blocking_trx_id/requesting_trx_id已不适用 - 该表不包含 SQL 内容,必须 JOIN
INNODB_TRX才能拿到trx_query和trx_started
JOIN INNODB_TRX 补全事务上下文
仅看锁等待关系无法判断谁在等谁执行什么,必须把等待对和事务详情关联起来:
SELECT r.trx_id AS waiting_trx_id, r.trx_query AS waiting_query, r.trx_started AS waiting_started, b.trx_id AS blocking_trx_id, b.trx_query AS blocking_query, b.trx_started AS blocking_started FROM performance_schema.data_lock_waits w JOIN information_schema.INNODB_TRX b ON b.trx_id = w.BLOCKING_TRX_ID JOIN information_schema.INNODB_TRX r ON r.trx_id = w.REQUESTING_TRX_ID;
- 若查询无结果,不代表没锁等待——可能事务已提交/回滚,快照已消失;此时需立即执行
SHOW ENGINE INNODB STATUS -
INNODB_TRX中的trx_state = 'LOCK WAIT'是关键筛选条件,可先过滤出所有疑似等待事务 - 注意:MySQL 5.7 不支持
performance_schema.data_lock_waits,只能退回到INNODB_LOCK_WAITS+INNODB_LOCKS组合(但后者在 8.0.24+ 也已移除)
用 SHOW ENGINE INNODB STATUS 补漏和验证死锁
当 data_lock_waits 查不到等待链,或怀疑存在死锁循环时,这是唯一权威来源。重点看 “LATEST DETECTED DEADLOCK” 和 “TRANSACTIONS” 部分:
- “WAITING FOR THIS LOCK TO BE GRANTED” 明确写出当前事务卡在哪条语句、哪个索引、哪一行(甚至具体主键值)
- “HOLDS THE LOCK(S)” 列出该事务当前持有的全部锁,包括记录锁、间隙锁、临键锁,能帮你确认是否因间隙锁意外扩大了锁定范围
- 死锁日志里出现的事务 ID 是十六进制格式(如
123456789ABC),而INNODB_TRX.trx_id是十进制整数,不能直接比对;需用CONV(HEX(trx_id), 16, 10)转换 - 该命令输出是文本块,无法直接 JOIN,只能人工对照——这也是所谓“图表工具”难以自动化的根本原因
真正难的不是画图,而是理解每一条锁记录背后的索引使用、隔离级别影响和语句执行路径。比如同样一句 SELECT ... FOR UPDATE,走主键、走二级唯一索引、走非唯一索引、无索引,触发的锁类型(记录锁 / 临键锁 / 全表锁)完全不同,而这些细节,任何自动图表都看不到。











