mysql 8.0 必须用 performance_schema 而非 information_schema 查事务锁,因 innodb_trx 和 innodb_locks 已被彻底移除,锁信息仅存在于 data_locks、data_lock_waits 和 transactions 视图中,且需启用 instrumentation 和对应 consumer 才能获取实时锁等待关系。

查事务锁依赖为什么要用 performance_schema 而不是 information_schema
MySQL 8.0 中,information_schema.INNODB_TRX 和 INNODB_LOCKS 已被移除(5.7 就已弃用),锁信息只保留在 performance_schema。直接查 INNODB_TRX 会报错:Table 'information_schema.INNODB_TRX' doesn't exist。必须切换到 performance_schema 下的 data_locks、data_lock_waits、transactions 这三个核心视图。
performance_schema.data_lock_waits 是锁等待关系的唯一来源
这个视图明确记录了谁在等谁——BLOCKING_ENGINE_TRANSACTION_ID 指向持有锁的事务 ID,REQUESTING_ENGINE_TRANSACTION_ID 是被阻塞的事务 ID。但它不包含 SQL 或用户信息,纯 ID 映射。
- 必须关联
performance_schema.transactions才能拿到PROCESSLIST_ID(即线程 ID)和STATE -
PROCESSLIST_ID可进一步关联performance_schema.threads获取PROCESSLIST_USER、PROCESSLIST_INFO(即原始 SQL) -
data_lock_waits默认只对启用 lock instrumentation 的线程有效,需确认:SELECT * FROM performance_schema.setup_consumers WHERE NAME = 'global_instrumentation';返回ENABLED = YES
一个能直接看到“谁卡了谁 + 执行什么 SQL”的查询
以下语句合并了锁等待、事务状态、线程信息,适用于排查实时阻塞:
SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread, b.trx_query blocking_query FROM performance_schema.data_lock_waits w JOIN performance_schema.transactions b ON b.ENGINE_TRANSACTION_ID = w.BLOCKING_ENGINE_TRANSACTION_ID JOIN performance_schema.transactions r ON r.ENGINE_TRANSACTION_ID = w.REQUESTING_ENGINE_TRANSACTION_ID WHERE b.trx_state = 'ACTIVE' AND r.trx_state = 'LOCK WAIT';
注意:trx_query 在 transactions 视图中可能为 NULL(比如事务刚开启还没执行语句),此时需查 threads.PROCESSLIST_INFO 补充;另外该查询不显示行级锁的具体对象(如哪张表哪一行),要定位具体锁记录得查 data_locks 并解析 LOCK_DATA 字段。
为什么查不到锁或等待关系?常见漏点
不是数据没锁,而是视图没“看见”——几个关键开关必须打开:
-
performance_schema必须启用:SHOW VARIABLES LIKE 'performance_schema';返回ON - 锁相关 instrument 必须开启:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'wait/lock%'; - 对应 consumer 也要开:
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME IN ('global_instrumentation', 'thread_instrumentation', 'events_statements_current'); - 如果用的是普通账户,需授权:
GRANT SELECT ON performance_schema.* TO 'user'@'%';(仅SELECT即可,无需PROCESS权限)
最常忽略的是 instrumentation 没开——哪怕 performance_schema 开着,data_lock_waits 也会永远为空。











