DATA_LOCK_WAITS

最近更新时间:2025-07-28 15:33:51

我的收藏

功能

PERFORMANCE_SCHEMA.DATA_LOCK_WAITS 用于展示集群中所有 hybrid 节点的 TDStore 上所有悲观锁等待信息。
在用户没有查询 DATA_LOCK_WAITS 表的时候,DATA_LOCK_WAITS 不会带来额外的开销。用户不需要将 performance_schema 系统变量设置为 ON,即可查询 DATA_LOCK_WAITS 表。

字段说明

字段名
类型
描述
ENGINE
varchar(32)
存储引擎。对于 TDStore,值是 RocksDB
REQUESTING_ENGINE_LOCK_ID
varchar(128)
唯一标识被阻塞的事务正在申请的悲观锁,或者正在读取的 key 范围。对于 TDStore,其格式为 <持有锁的事务 ID>_<锁范围><锁范围>的格式是:
如果锁的范围是一个单条的 key,则<锁范围>为 key 的十六进制表示。例如:锁标识符 28673778183569468_00002797 表示 ID 为 28673778183569468的事务在十六进制编码为 00002797 的 key 上加了一个悲观锁。
如果锁的范围是一个 key 区间,则<锁范围>格式为 [<hex_start_key>,<hex_end_key>)(左闭右开)或 (<hex_start_key>,<hex_end_key>)(开区间)。例如:锁标识符 28673778183569468_[00002797,00002798),表示 ID 为 28673778183569468的事务在 [00002797,00002798) 区间加了一个悲观锁。
当 key 的十六进制编码过长的时候,可能无法在128字符内表示完全。这个时候,字段值的后两个字符会被置为..,表示这不是一个完整的锁标识符。这种情况下,用户通过 ENGINE_LOCK_ID 查询悲观锁信息时,也需要使用带有..的字段值做查询。
REQUESTING_ENGINE_TRANSACTION_ID
bigint unsigned
被阻塞的事务的唯一标识符。对于 TDStore,如果被阻塞的是只读请求,则值为0
REQUESTING_THREAD_ID
bigint unsigned
执行被阻塞事务的线程 ID。对于 TDStore ,值为 NULL
REQUESTING_EVENT_ID
bigint unsigned
导致被阻塞的事务加锁的 Performance Schema 事件 ID。对于 TDStore,值为NULL
REQUESTING_OBJECT_INSTANCE_BEGIN
bigint unsigned
等锁请求在内存中的地址。
BLOCKING_ENGINE_LOCK_ID
varchar(128)
悲观锁的唯一标识。对于 TDStore ,格式参考data_locks表的 ENGINE_LOCK_ID字段。
BLOCKING_ENGINE_TRANSACTION_ID
bigint unsigned
持有悲观锁的事务的唯一标识符。如果这个悲观锁是读锁,被多个事务共同持有,则只会展示其中一个事务的唯一标识符。
BLOCKING_THREAD_ID
bigint unsigned
执行持有悲观锁的事务的线程 ID。对于 TDStore ,值为 NULL
BLOCKING_EVENT_ID
bigint unsigned
导致持有悲观锁的事务加锁的 Performance Schema 事件 ID。对于 TDStore ,值为 NULL
BLOCKING_OBJECT_INSTANCE_BEGIN
bigint unsigned
悲观锁在内存中的地址。
TINDEX_ID
int unsigned
悲观锁对应的 tindex ID。通过这个字段的值,我们可以执行SELECT * FROM information_schema.statistics WHERE tindex_id=... 从系统表中获取 tindex ID 对应的表信息。
DATA_SPACE_TYPE
varchar(32)
悲观锁对应的 data space。DATA_SPACE_TYPE_USER代表对用户表的部分数据加锁,DATA_SPACE_TYPE_SYSTEM代表对系统表的部分数据加锁。
REPLICATION_GROUP_ID
bigint unsigned
悲观锁对应的 replication group ID。
KEY_RANGE_REGION_ID
bigint unsigned
悲观锁对应的 key range region ID。

示例

输出示例:
tdsql [(none)]> SELECT * FROM performance_schema.data_lock_waits \\G
*************************** 1. row ***************************
ENGINE: RocksDB
REQUESTING_ENGINE_LOCK_ID: 28681541555060779_[00002797,00002798)
REQUESTING_ENGINE_TRANSACTION_ID: 28681541555060779
REQUESTING_THREAD_ID: 0
REQUESTING_EVENT_ID: 0
REQUESTING_OBJECT_INSTANCE_BEGIN: 139759771095568
BLOCKING_ENGINE_LOCK_ID: 28681535313936395_0000279780000001
BLOCKING_ENGINE_TRANSACTION_ID: 28681535313936395
BLOCKING_THREAD_ID: 0
BLOCKING_EVENT_ID: 0
BLOCKING_OBJECT_INSTANCE_BEGIN: 139759768476120
TINDEX_ID: 10135
DATA_SPACE_TYPE: DATA_SPACE_TYPE_USER
REPLICATION_GROUP_ID: 257
KEY_RANGE_REGION_ID: 7312
查询示例:
-- 查询所有节点上,等待悲观锁的请求数量
SELECT COUNT(*) FROM performance_schema.data_lock_wais \\G

-- 查询所有节点上,replication group 257 的 key range region 7312 的所有的悲观锁等待信息(仅指定 key_range_region_id 也可查询,但效率较差,无法利用索引加速查询)
SELECT * FROM performance_schema.data_lock_waits WHERE replication_group_id = 257 AND key_range_region_id = 7312 \\G

-- 查询所有节点上,事务 28682479434989637 正在等待的悲观锁的信息
SELECT blocking_engine_lock_id FROM performance_schema.data_lock_waits WHERE requesting_engine_transaction_id = 28682479434989637;
-- engine_lock_id 指定为第一条 sql 查询获得的 blocking_engine_lock_id 字段值。
SELECT * FROM performance_schema.data_locks WHERE engine_lock_id = '29417475275751454_00002C7B80000003';