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

6次阅读

直接查锁等待需关注三类信息:谁卡住了、谁挡了路、卡在哪儿;通过 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+)可还原锁对象(哪张表、哪一行、什么锁模式)
星耀云
版权声明:本站原创文章,由 星耀云 2025-12-29发表,共计1236字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources