DATA_LOCKS

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

我的收藏

功能

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

字段说明

字段名
类型
描述
ENGINE
varchar(32)
存储引擎。对于 TDStore为RocksDB
ENGINE_LOCK_ID
varchar(128)
悲观锁的唯一标识符。对于 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 查询悲观锁信息时,也需要使用带有..的字段值做查询。
ENGINE_TRANSACTION_ID
bigint unsigned
持有悲观锁的事务的唯一标识符。如果这个悲观锁是读锁,被多个事务共同持有,则只会展示其中一个事务的唯一标识符。
THREAD_ID
bigint unsigned
对应开启该事务的会话(session)ID。
EVENT_ID
bigint unsigned
导致加锁的 Performance Schema 事件 ID。对于 TDStore 为 NULL
OBJECT_SCHEMA
varchar(64)
悲观锁对应的数据库名。对于 TDStore 为 NULL
OBJECT_NAME
varchar(64)
悲观锁对应的表名。对于 TDStore 为 NULL
PARTITION_NAME
varchar(64)
悲观锁对应的分区名。对于 TDStore 为 NULL
SUBPARTITION_NAME
varchar(64)
悲观锁对应的子分区名。对于 TDStore 为 NULL
INDEX_NAME
varchar(64)
悲观锁对应的索引名。对于 TDStore 为 NULL
OBJECT_INSTANCE_BEGIN
bigint unsigned
悲观锁在内存中的地址。
LOCK_TYPE
varchar(32)
悲观锁的类型。对于 TDStore,KEY值代表对单条 key 加锁,PRE_RANGE值代表对 key 区间加锁。
LOCK_MODE
varchar(32)
悲观锁的读写模式。对于 TDStore,Write值代表加写锁,Read值代表加读锁。
LOCK_STATUS
varchar(32)
悲观锁的状态。对于 TDStore,值为GRANTED,即加锁成功。正在加的锁不会展示在 data_locks 表中,该信息可以通过查询 data_lock_waits 表获取。
LOCK_DATA
varchar(8192)
额外的信息,值由各个存储引擎自行决定。对于TDStore,值为 NULL
START_KEY
varchar(128)
对于单条 key 上的锁,值为 NULL;对于 key 区间上的锁,值代表 key 区间的左边界的十六进制编码。
END_KEY
varchar(128)
对于单条 key 上的锁,值代表该 key 的十六进制编码;对于 key 区间上的锁,值代表 key 区间的右边界的十六进制编码。
EXCLUDE_START_KEY
tinyint(1)
当且仅当悲观锁范围是一个 key 区间,且该区间为开区间时,值为1;否则,值为0。
BLOCKING_TRANSACTION_NUM
bigint unsigned
在该悲观锁上等待加锁的事务数量。
BLOCKING_CHECK_READ_TRANSACTION_NUM
bigint unsigned
在该悲观锁上等待快照读的事务数量。当持有悲观锁的事务进入提交流程的时候,悲观锁会阻塞快照读请求。
READ_LOCKED_NUM
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。
说明:
TDStore 暂未支持在 data_locks表中直接展示库名、表名等信息。如果需要查看表信息,可以根据TINDEX_ID字段的值,直接从 information_schema.statistics表查询。

示例

输出示例:
tdsql [(none)]> SELECT * FROM performance_schema.data_locks \\G
*************************** 1. row ***************************
ENGINE: RocksDB
ENGINE_LOCK_ID: 28681376014270466_(0000279780000006,00002798)
ENGINE_TRANSACTION_ID: 28681376014270466
THREAD_ID: 47601122555917
EVENT_ID: NULL
OBJECT_SCHEMA:
OBJECT_NAME:
PARTITION_NAME: NULL
SUBPARTITION_NAME: NULL
INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 140502282795216
LOCK_TYPE: PRE_RANGE
LOCK_MODE: Write
LOCK_STATUS: GRANTED
LOCK_DATA: NULL
START_KEY: 0000279780000006
END_KEY: 00002798
EXCLUDE_START_KEY: 1
BLOCKING_TRANSACTION_NUM: 0
BLOCKING_CHECK_READ_TRANSACTION_NUM: 0
READ_LOCKED_NUM: 0
TINDEX_ID: 10135
DATA_SPACE_TYPE: DATA_SPACE_TYPE_USER
REPLICATION_GROUP_ID: 257
KEY_RANGE_REGION_ID: 7312
*************************** 2. row ***************************
ENGINE: RocksDB
ENGINE_LOCK_ID: 28681376014270466_0000279780000006
ENGINE_TRANSACTION_ID: 28681376014270466
THREAD_ID: NULL
EVENT_ID: NULL
OBJECT_SCHEMA:
OBJECT_NAME:
PARTITION_NAME: NULL
SUBPARTITION_NAME: NULL
INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 140507882943448
LOCK_TYPE: KEY
LOCK_MODE: Write
LOCK_STATUS: GRANTED
LOCK_DATA: NULL
START_KEY: NULL
END_KEY: 0000279780000006
EXCLUDE_START_KEY: 0
BLOCKING_TRANSACTION_NUM: 0
BLOCKING_CHECK_READ_TRANSACTION_NUM: 0
READ_LOCKED_NUM: 0
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_locks \\G

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

-- 查询所有节点上,和 [0000279780000003, 0000279780000004] 有交集的所有悲观锁的信息
SET @left = "0000279780000003";
SET @right = "0000279780000004";
SELECT * FROM performance_schema.data_locks WHERE
(lock_type = 'KEY' AND @left <= end_key AND end_key <= @right) OR -- 如果是单条 key 上的悲观锁,那么对应的 key 存储在 end_key 字段上,只要 end_key 在区间内即可
(lock_type = 'PRE_RANGE' AND @left < end_key AND (start_key < @right OR (NOT exclude_start_key and start_key = @right))) \\G -- 如果是 key 区间上的悲观锁,那么需要根据 exclude_start_key,判断 [start_key, end_key) 或 (start_key, end_key) 和区间是否有交集

-- 查询所有节点上,testdb.test 表所有悲观锁的信息
-- 第一步:获取 testdb.test 的 tindex_id
SELECT tindex_id FROM information_schema.statistics WHERE table_schema = 'testdb' AND table_name = 'test';
-- 第二步:使用第一步获取到的 tindex_id 查询锁信息
SELECT * FROM performance_schema.data_locks WHERE tindex_id = 12345;

-- 查询所有节点上,事务 28681535313936395 所加所有悲观锁的信息
SELECT * FROM performance_schema.data_locks WHERE engine_transaction_id = 28681535313936395 \\G

-- 查询所有节点上,阻塞了事务的所有悲观锁的信息
SELECT * FROM performance_schema.data_locks WHERE blocking_transaction_num > 0 OR blocking_check_read_transaction_num > 0
展示被阻塞的参与者信息:
下面展示了三个并发执行的 session。在这个例子中,session B 和 session C 的查询语句会被 session A 在表 t 上加的范围悲观锁阻塞。
session A:
BEGIN;
SELECT a FROM t FOR UPDATE;
SELECT SLEEP(100);
session B:
SELECT b FROM t FOR UPDATE;
session C:
SELECT c FROM t FOR UPDATE;
此时,使用以下查询语句去查询哪些事务正在等待,以及它们正在被哪些事务阻塞。
SELECT blocking_engine_transaction_id, blocking_engine_lock_id, requesting_engine_transaction_id, requesting_engine_lock_id, tindex_id, replication_group_id, key_range_region_id FROM performance_schema.data_lock_waits \\G
结果如下:
blocking_engine_transaction_id
blocking_engine_lock_id
requesting_engine_transaction_id
requesting_engine_lock_id
tindex_id
replication_group_id
key_range_region_id
28687218495193155
28687218495193155_[00002819,0000281A)
28687218897846327
28687218897846327_[00002819,0000281A)
10265
257
103181
28687218495193155
28687218495193155_[00002819,0000281A)
28687218746851349
28687218746851349_[00002819,0000281A)
10265
257
103181