以下 SQL 可直接在 MySQL 8.0 实例执行,用于快速找出当前正在阻塞其他事务的会话和 SQL 语句。
SELECT w.*, t.trx_query, t.trx_mysql_thread_id
FROM performance_schema.data_lock_waits w
JOIN information_schema.innodb_trx t
ON w.blocking_engine_transaction_id = t.trx_id;
若需查看等待锁的具体会话信息,可关联 processlist 表:
SELECT w.*, p.user, p.host, p.command
FROM performance_schema.data_lock_waits w
JOIN information_schema.processlist p
ON w.blocking_engine_thread_id = p.id;
为什么会这样
锁等待严重通常是因为某个事务持有锁时间过长,导致后续请求排队。
InnoDB 引擎使用行锁控制并发,当事务 A 修改了某行数据未提交,事务 B 再修改同一行数据时就会进入等待状态。MySQL 8.0 引入了 performance_schema.data_locks 和 performance_schema.data_lock_waits 表,相比旧版本的 SHOW ENGINE INNODB STATUS,能更结构化地展示锁等待关系。公开资料中没有看到可靠的量化数据说明新视图带来的性能开销,但在排查效率上官方文档明确推荐用于锁诊断。