如何查看锁等待情况_mysql锁信息查询

25次阅读

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

如何查看锁等待情况_mysql锁信息查询

直接查锁等待,关键看三类信息:谁卡住了、谁挡了路、卡在哪儿。不用猜,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 lockLocked,这是表级或元数据锁的典型表现

定位正在等待的事务

进入 information_schema 查活跃事务状态:

  • select * FROM INNODB_TRX WHERE trx_state = ‘LOCK WAIT’G; —— 直接列出所有卡在锁上的事务,重点关注 trx_idtrx_query(被阻塞的SQL)、trx_wait_started(卡了多久)
  • 配合 SELECT * FROM PROCESSLIST WHERE ID = [trx_mysql_thread_id]; 可看到该事务对应的连接详情,比如用户、数据库、运行时长

找出阻塞源头(谁持有了锁)

光知道谁在等不够,必须找到“挡路人”:

  • SELECT * FROM INNODB_LOCK_WAITSG; —— 返回等待与阻塞的事务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 STATUSG; —— 输出里重点看三块:LATEST DETECTED DEADLOCK(最近死锁全记录)、TRANSACTIONS(所有事务锁状态)、LOCK WAIT(当前锁等待快照)
  • 其中 TRANSACTIONS 部分会明确标出某事务是 LOCK WAIT,并给出它等待的 lock_id 和已持有的 lock(s),结合 INNODB_LOCKS(5.7及以前)或 data_locks(8.0+)可还原锁对象(哪张表、哪一行、什么锁模式)
text=ZqhQzanResources