information_schema.innodb_lock_waits
表是MySQL系统数据库information_schema
中的一个表,它记录了InnoDB存储引擎中事务等待锁的情况。这个表对于诊断和解决锁争用、检测死锁等问题至关重要,因为它明确指出了哪些事务因为等待其他事务释放锁而被阻塞。下面是该表中主要字段的解释以及一个使用示例。
字段详解:
-
requesting_trx_id: 请求锁但被阻塞的事务ID。这是等待事务的唯一标识。
-
requesting_session_id: 发起请求锁的会话ID,对应于
performance_schema.threads
表中的thread_id
,有助于进一步跟踪会话信息。 -
requesting_transaction_info: 提供请求事务的额外信息,比如事务的状态或SQL查询(在某些版本中可能不可用或信息有限)。
-
blocking_trx_id: 导致阻塞的事务ID,即持有锁的事务。
-
blocking_session_id: 持有锁的会话ID。
-
blocking_transaction_info: 阻塞事务的额外信息,同样可能包括事务状态或SQL查询(具体信息取决于MySQL版本)。
-
locked_table: 被请求锁定的表名,表明争用的资源。
-
locking_schema: 被锁定表所属的数据库名。
-
locking_table: 指出锁定的表名,有时与
locked_table
相同,但在复杂查询中可能涉及多个表的锁定情况。 -
locking_mode: 锁定模式,如
X
(排他锁)、S
(共享锁)等。
使用示例:
当你怀疑数据库中存在锁争用或死锁时,可以查询innodb_lock_waits
表来找出具体哪些事务正在等待,以及它们等待的是哪个事务的锁。一个基本的查询示例如下:
SELECT
iw.requesting_trx_id AS waiting_trx_id,
iw.blocking_trx_id AS blocking_trx_id,
ilr.lock_mode AS waiting_lock_mode,
ilb.lock_mode AS blocking_lock_mode,
iw.locked_table
FROM
information_schema.innodb_lock_waits iw
JOIN
information_schema.innodb_locks ilr ON iw.requesting_lock_id = ilr.lock_id
JOIN
information_schema.innodb_locks ilb ON iw.blocking_lock_id = ilb.lock_id;
这个查询会返回所有等待锁的事务ID、阻塞它们的事务ID、等待和阻塞的锁模式以及被请求锁定的表名。有了这些信息,你可以进一步分析哪些事务可能导致了锁争用,从而决定是否需要优化事务逻辑、调整事务隔离级别或手动介入解决锁冲突,比如通过KILL
命令终止导致阻塞的事务。