查行锁持有者不必用sys.innodb_lock_waits,它仅展示等待关系;需关联sys.innodb_locks、sys.innodb_trx和sys.processlist,通过blocking_trx_id→trx_mysql_thread_id→processlist.id链路定位持锁会话及SQL。

查行锁持有者必须用 sys.innodb_lock_waits 吗?
不是。直接查 sys.innodb_lock_waits 只能拿到锁等待关系,不显示谁在“持锁”,它本质是 INFORMATION_SCHEMA.INNODB_LOCK_WAITS 的视图封装,字段里没有持锁事务的完整会话信息。真正要定位“谁卡着别人”,得关联 sys.innodb_locks 和 sys.innodb_trx,再捞出 trx_mysql_thread_id 去匹配 sys.processlist。
怎么从锁记录反查到具体会话和 SQL?
核心链路是:锁等待 → 持锁事务 ID → 事务线程 ID → 当前会话详情。实际执行时建议用这个查询:
SELECT pl.ID AS blocking_thread_id, pl.USER AS blocking_user, pl.HOST AS blocking_host, pl.DB AS blocking_db, pl.COMMAND AS blocking_command, pl.TIME AS blocking_time, pl.STATE AS blocking_state, pl.INFO AS blocking_sql, trx.trx_id AS blocking_trx_id, trx.trx_started AS blocking_trx_started FROM sys.innodb_lock_waits w JOIN sys.innodb_locks bl ON w.blocking_engine_lock_id = bl.lock_id JOIN sys.innodb_trx trx ON bl.lock_trx_id = trx.trx_id JOIN sys.processlist pl ON trx.trx_mysql_thread_id = pl.id;
注意点:
-
blocking_engine_lock_id是 InnoDB 内部锁 ID,不能直接当字符串比对,必须通过sys.innodb_locks关联 -
sys.innodb_locks在 MySQL 8.0.15+ 才默认启用;低于该版本需手动开启innodb_monitor_enable = lock_mutex,lock(不推荐,开销大) -
pl.INFO显示的是会话当前正在执行的语句,但若事务已提交或回滚,该字段可能为NULL,此时得结合trx_started和trx_query(如有)判断
为什么有时查不到持锁会话,但锁确实存在?
常见原因有三个:
- 事务已提交或回滚,但锁未及时释放(极少见,多见于崩溃恢复后状态不一致)
- 持锁者是内部线程(如
BACKGROUND或DDL线程),不在sys.processlist中显示 - 你没权限看其他用户的会话 ——
PROCESS权限只够查自己,要查全部需SUPER或PROCESS+SELECTonperformance_schema
验证是否权限不足:运行 SELECT COUNT(*) FROM sys.processlist WHERE user != USER();,如果返回 0 但你知道有其他活跃连接,基本就是权限问题。
MySQL 5.7 能不能用 sys 库查行锁?
可以,但限制明显:
-
sys库在 5.7.7+ 才随官方包自带,旧版需手动安装(mysql_upgrade或执行sys_schema.sql) -
sys.innodb_lock_waits在 5.7 中字段更少,没有blocking_engine_lock_id,得改用blocking_trx_id关联sys.innodb_trx,再靠trx_mysql_thread_id找会话 - 5.7 的
sys.innodb_locks不包含lock_data(被锁的具体行值),无法知道锁在哪一行,只能确认表和索引
所以如果你只关心“谁在锁”,5.7 也能做;但想定位到某条 WHERE id = 123 的具体行,就得升级到 8.0 并确保 innodb_status_output_locks 开启(不过这属于 InnoDB monitor 输出,不是 sys 库能力)。
真正麻烦的不是查不到,而是查到后发现持锁会话正执行一个没加 COMMIT 的长事务,或者锁在存储过程中被隐式持有 —— 这时候 INFO 字段往往为空,得翻 trx_query 和 trx_state 综合判断。


















