data_lock_waits
表实现了一个多对多关系,显示了 data_locks
表中的哪些数据锁请求被 data_locks
表中的哪些持有数据锁阻塞。只有当 data_locks
中的持有锁阻塞了某些锁请求时,它们才会出现在 data_lock_waits
中。
此信息使您能够了解会话之间的数据锁依赖关系。该表不仅公开了会话或事务正在等待哪个锁,还公开了当前持有该锁的会话或事务。
数据锁等待信息示例
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
与大多数 Performance Schema 数据收集不同,没有用于控制是否收集数据锁信息的检测器,也没有用于控制数据锁表大小的系统变量。Performance Schema 收集服务器中已经可用的信息,因此生成此信息没有内存或 CPU 开销,也不需要控制其收集的参数。
使用 data_lock_waits
表可以帮助诊断在高并发负载期间出现的性能问题。对于 InnoDB
,请参阅 第 17.15.2 节“InnoDB INFORMATION_SCHEMA 事务和锁信息” 中对此主题的讨论。
由于 data_lock_waits
表中的列与 data_locks
表中的列类似,因此此处对列的描述进行了简化。有关更详细的列描述,请参阅 第 29.12.13.1 节“data_locks 表”。
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
在请求锁的会话中导致锁请求的 Performance Schema 事件。
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
在持有阻塞锁的会话中导致阻塞锁的 Performance Schema 事件。
BLOCKING_OBJECT_INSTANCE_BEGIN
内存中阻塞锁的地址。
data_lock_waits
表具有以下索引:
(
REQUESTING_ENGINE_LOCK_ID
,ENGINE
) 上的索引(
BLOCKING_ENGINE_LOCK_ID
,ENGINE
) 上的索引索引 (
REQUESTING_ENGINE_TRANSACTION_ID
,ENGINE
)索引 (
BLOCKING_ENGINE_TRANSACTION_ID
,ENGINE
)索引 (
REQUESTING_THREAD_ID
,REQUESTING_EVENT_ID
)索引 (
BLOCKING_THREAD_ID
,BLOCKING_EVENT_ID
)
TRUNCATE TABLE
语句不允许用于 data_lock_waits
表。