该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
表可帮助诊断在并发负载较重时发生的性能问题。对于,请参阅第 15.15.2 节“InnoDB INFORMATION_SCHEMA 事务和锁定信息”InnoDB
中对此主题的讨论
。
由于表中的列与
data_lock_waits
表中的列相似,data_locks
此处的列说明有所简化。有关更详细的列描述,请参阅
第 27.12.13.1 节,“data_locks 表”。
该data_lock_waits
表有以下列:
ENGINE
请求锁的存储引擎。
REQUESTING_ENGINE_LOCK_ID
存储引擎请求的锁的 ID。要获取有关锁的详细信息,请将此列与表的列连接
ENGINE_LOCK_ID
起来data_locks
。REQUESTING_ENGINE_TRANSACTION_ID
请求锁的事务的存储引擎内部 ID。
REQUESTING_THREAD_ID
请求锁定的会话的线程 ID。
REQUESTING_EVENT_ID
在请求锁定的会话中导致锁定请求的性能模式事件。
REQUESTING_OBJECT_INSTANCE_BEGIN
请求的锁在内存中的地址。
BLOCKING_ENGINE_LOCK_ID
阻塞锁的 ID。要获取有关锁的详细信息,请将此列与表的列连接
ENGINE_LOCK_ID
起来data_locks
。BLOCKING_ENGINE_TRANSACTION_ID
持有阻塞锁的事务的存储引擎内部 ID。
BLOCKING_THREAD_ID
持有阻塞锁的会话的线程 ID。
BLOCKING_EVENT_ID
在持有它的会话中导致阻塞锁的性能模式事件。
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
表。
在 MySQL 8.0.1 之前,该表中提供了类似于 Performance Schema
data_lock_waits
表中的
INFORMATION_SCHEMA.INNODB_LOCK_WAITS
信息,它提供了有关每个阻塞
InnoDB
事务的信息,指示它已请求的锁以及正在阻塞该请求的任何锁。
INFORMATION_SCHEMA.INNODB_LOCK_WAITS
已弃用并从 MySQL 8.0.1 开始删除。
data_lock_waits
应该改用。
这些表所需的权限不同:
INNODB_LOCK_WAITS
表需要全局
PROCESS
权限。该
data_lock_waits
表需要通常的 Performance Schema 权限
SELECT
才能从中选择表。
下表显示了从
INNODB_LOCK_WAITS
列到
data_lock_waits
列的映射。使用此信息将应用程序从一个表迁移到另一个表。
表 27.5 从 INNODB_LOCK_WAITS 到 data_lock_waits 列的映射
INNODB_LOCK_WAITS 列 | data_lock_waits 列 |
---|---|
REQUESTING_TRX_ID |
REQUESTING_ENGINE_TRANSACTION_ID |
REQUESTED_LOCK_ID |
REQUESTING_ENGINE_LOCK_ID |
BLOCKING_TRX_ID |
BLOCKING_ENGINE_TRANSACTION_ID |
BLOCKING_LOCK_ID |
BLOCKING_ENGINE_LOCK_ID |