29.12.13.2 数据锁等待表
The data_lock_waits
table implements a many-到-多关系,显示哪些数据锁请求在 data_locks
表中被哪些持有数据锁的会话阻塞。表中显示在 data_locks
表中的持锁会话中只有当它们阻止某个锁请求时才出现。
这项信息使您能够理解会话之间的数据锁依赖关系。这张表不仅显示了哪个锁会话或事务正在等待,还显示了当前持有该锁的会话或事务。
示例数据锁等待信息:
mysql> SELECT * FROM performance_schema.data_lock_waits\G
*************************** 1. row ***************************
ENGINE: INNODB
REQUESTING_ENGINE_LOCK_ID: 140211201964816:2:4:2:140211086465800
REQUESTING_ENGINE_TRANSACTION_ID: 1555
REQUESTING_THREAD_ID: 47
REQUESTING_EVENT_ID: 5
REQUESTING_OBJECT_INSTANCE_BEGIN: 140211086465800
BLOCKING_ENGINE_LOCK_ID: 140211201963888:2:4:2:140211086459880
BLOCKING_ENGINE_TRANSACTION_ID: 1554
BLOCKING_THREAD_ID: 46
BLOCKING_EVENT_ID: 12
BLOCKING_OBJECT_INSTANCE_BEGIN: 140211086459880
与大多数性能方案收集不同,没有用于控制是否收集数据锁信息或系统变量用于控制数据锁表大小的工具。性能方案收集的是服务器已经存在的信息,因此没有生成此信息的内存或CPU开销,也不需要参数来控制其收集。
使用 data_lock_waits
表来帮助诊断在高并发负载期间发生的性能问题。对于 InnoDB
,请参阅第17.15.2节,“InnoDB INFORMATION_SCHEMA事务和锁定信息”。
由于 data_lock_waits
表的列与 data_locks
表的列相似,这里提供的列描述简化。对于更详细的列描述,请参阅第29.12.13.1节,“The data_locks Table”。
data_lock_waits
表具有以下列:
-
ENGINE
请求锁定的存储引擎。
-
REQUESTING_ENGINE_LOCK_ID
存储引擎请求的锁定ID。要获取有关锁的详细信息,请将此列与
data_locks
表中的ENGINE_LOCK_ID
列进行连接。 -
REQUESTING_ENGINE_TRANSACTION_ID
存储引擎内部的事务ID,该事务请求了锁定。
-
REQUESTING_THREAD_ID
请求锁定的会话的线程ID。
-
REQUESTING_EVENT_ID
在请求锁定的事务中引发性能方案事件的ID。
-
REQUESTING_OBJECT_INSTANCE_BEGIN
内存中的请求锁定的地址开始处。
-
BLOCKING_ENGINE_LOCK_ID
阻塞锁定的ID。要获取有关锁的详细信息,请将此列与
data_locks
表中的ENGINE_LOCK_ID
列进行连接。 -
BLOCKING_ENGINE_TRANSACTION_ID
存储引擎内部的事务ID,该事务持有阻塞锁定。
-
BLOCKING_THREAD_ID
持有阻塞锁定的会话的线程ID。
-
BLOCKING_EVENT_ID
在持有阻塞锁定的事务中引发性能方案事件的ID。
-
BLOCKING_OBJECT_INSTANCE_BEGIN
内存中的阻塞锁定的地址开始处。
data_lock_waits
表具有以下索引:
-
在 (
REQUESTING_ENGINE_LOCK_ID
,ENGINE
) 上的索引 -
在 (
BLOCKING_ENGINE_LOCK_ID
,ENGINE
) 上的索引 -
在表上创建索引(
请求事务ID
,引擎
) -
在表上创建索引(
阻塞事务ID
,引擎
) -
在表上创建索引(
请求线程ID
,请求事件ID
) -
在表上创建索引(
阻塞线程ID
,阻塞事件ID
)
TRUNCATE TABLE
对 data_lock_waits
表不允许。