直接查锁等待需关注三类信息:谁卡住了、谁挡了路、卡在哪儿;通过SHOW STATUS、INNODB_TRX、INNODB_LOCK_WAITS等视图及SHOW ENGINE INNODB STATUS可准确定位锁等待与死锁。

直接查锁等待,关键看三类信息:谁卡住了、谁挡了路、卡在哪儿。不用猜,MySQL自带视图和命令就能准确定位。
快速确认是否存在锁等待
执行这条命令,一眼看出有没有行级锁等待:
- SHOW STATUS LIKE 'innodb_row_lock%'; —— 关注 Innodb_row_lock_current_waits 值是否大于 0;大于 0 就说明当前有事务正在等行锁
- SHOW OPEN TABLES WHERE in_use > 0; —— 查是否有表被显式锁定(如 ALTER、DROP 过程中)
- SHOW PROCESSLIST; —— 看 state 列是否出现 waiting for table metadata lock 或 Locked,这是表级或元数据锁的典型表现
定位正在等待的事务
进入 information_schema 查活跃事务状态:
- SELECT * FROM INNODB_TRX WHERE trx_state = 'LOCK WAIT'\G; —— 直接列出所有卡在锁上的事务,重点关注 trx_id、trx_query(被阻塞的SQL)、trx_wait_started(卡了多久)
- 配合 SELECT * FROM PROCESSLIST WHERE ID = [trx_mysql_thread_id]; 可看到该事务对应的连接详情,比如用户、数据库、运行时长
找出阻塞源头(谁持有了锁)
光知道谁在等不够,必须找到“挡路人”:
- SELECT * FROM INNODB_LOCK_WAITS\G; —— 返回等待与阻塞的事务ID映射关系:requesting_trx_id 是等待方,blocking_trx_id 是持有锁的一方
- 再用这个 blocking_trx_id 去查:SELECT * FROM INNODB_TRX WHERE trx_id = 'xxx'; —— 看它在执行什么SQL、是否长时间未提交、是否处于 RUNNING 状态
- MySQL 8.0+ 更推荐:SELECT * FROM performance_schema.data_lock_waits; 和 performance_schema.data_locks;,字段更清晰,支持按库表过滤
深入分析锁细节与死锁
当需要完整上下文,尤其是排查死锁或复杂嵌套等待时:
- SHOW ENGINE INNODB STATUS\G; —— 输出里重点看三块:LATEST DETECTED DEADLOCK(最近死锁全记录)、TRANSACTIONS(所有事务锁状态)、LOCK WAIT(当前锁等待快照)
- 其中 TRANSACTIONS 部分会明确标出某事务是 LOCK WAIT,并给出它等待的 lock_id 和已持有的 lock(s),结合 INNODB_LOCKS(5.7及以前)或 data_locks(8.0+)可还原锁对象(哪张表、哪一行、什么锁模式)










