mysql如何查看锁信息_mysql锁信息查询方式

来源:这里教程网 时间:2026-02-28 20:32:44 作者:

MySQL 查看锁信息主要依赖

information_schema
系统库中的三张 InnoDB 监控表,配合
SHOW PROCESSLIST
SHOW ENGINE INNODB STATUS
可以全面定位锁状态、阻塞关系和死锁原因。

查看当前运行的事务(含锁等待状态)

事务是锁的持有者,先查事务能快速识别活跃或卡住的操作:

SELECT * FROM information_schema.INNODB_TRX;
—— 显示所有正在运行的事务,重点关注
trx_state
(如
LOCK WAIT
)、
trx_wait_started
(等待开始时间)、
trx_query
(被阻塞的 SQL)、
trx_mysql_thread_id
(对应线程 ID)
若发现
trx_state = 'LOCK WAIT'
,说明该事务正因获取不到锁而挂起,需结合锁等待表进一步分析

查看当前持有的锁和等待的锁关系

仅看事务不够,需确认谁持有什么锁、谁在等谁:

SELECT * FROM information_schema.INNODB_LOCKS;
—— 列出当前每个事务持有的锁(注意:MySQL 8.0.18+ 已弃用此表,改用
performance_schema.data_locks
;但 5.7/8.0 早期仍可用)
SELECT * FROM information_schema.INNODB_LOCK_WAITS;
—— 直接显示阻塞链:
blocking_trx_id
是持锁事务 ID,
blocked_trx_id
是等待事务 ID
常用关联查询(兼容 5.7/8.0):
SELECT r.trx_id AS waiting_trx_id, r.trx_mysql_thread_id AS waiting_thread,<br>    r.trx_query AS waiting_query,<br>    b.trx_id AS blocking_trx_id, b.trx_mysql_thread_id AS blocking_thread,<br>    b.trx_query AS blocking_query<br>FROM information_schema.INNODB_TRX r<br>INNER JOIN information_schema.INNODB_LOCK_WAITS w ON r.trx_id = w.blocking_trx_id<br>INNER JOIN information_schema.INNODB_TRX b ON b.trx_id = w.blocked_trx_id;

查看线程与实时执行状态

辅助判断是否真有长事务、慢查询或异常连接:

SHOW FULL PROCESSLIST;
—— 显示所有连接线程,关注
State
列(如
Locked
Updating
Sending data
)和
Time
(持续秒数),长时间
Locked
很可能涉及锁争用
SELECT * FROM performance_schema.threads WHERE PROCESSLIST_STATE = 'Locked';
(适用于 MySQL 5.7+)
注意:普通用户默认只能看到自己的线程,需
PROCESS
权限或 root 才能查看全部

快速诊断死锁和底层锁详情

当发生死锁后,InnoDB 会自动回滚一个事务,并记录最近一次死锁信息:

SHOW ENGINE INNODB STATUS\G
—— 输出中搜索
LATEST DETECTED DEADLOCK
部分,包含两个冲突事务的完整 SQL、锁模式(
X
排他锁 /
S
共享锁)、锁定的具体行(
space id
,
page no
,
heap no
该命令还提供锁结构总数、事务列表、缓冲池状态等上下文,适合深度排查 注意:输出为文本块,建议加
\G
格式化查看,避免截断

相关推荐