功能
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: RocksDBENGINE_LOCK_ID: 28681376014270466_(0000279780000006,00002798)ENGINE_TRANSACTION_ID: 28681376014270466THREAD_ID: 47601122555917EVENT_ID: NULLOBJECT_SCHEMA:OBJECT_NAME:PARTITION_NAME: NULLSUBPARTITION_NAME: NULLINDEX_NAME: NULLOBJECT_INSTANCE_BEGIN: 140502282795216LOCK_TYPE: PRE_RANGELOCK_MODE: WriteLOCK_STATUS: GRANTEDLOCK_DATA: NULLSTART_KEY: 0000279780000006END_KEY: 00002798EXCLUDE_START_KEY: 1BLOCKING_TRANSACTION_NUM: 0BLOCKING_CHECK_READ_TRANSACTION_NUM: 0READ_LOCKED_NUM: 0TINDEX_ID: 10135DATA_SPACE_TYPE: DATA_SPACE_TYPE_USERREPLICATION_GROUP_ID: 257KEY_RANGE_REGION_ID: 7312*************************** 2. row ***************************ENGINE: RocksDBENGINE_LOCK_ID: 28681376014270466_0000279780000006ENGINE_TRANSACTION_ID: 28681376014270466THREAD_ID: NULLEVENT_ID: NULLOBJECT_SCHEMA:OBJECT_NAME:PARTITION_NAME: NULLSUBPARTITION_NAME: NULLINDEX_NAME: NULLOBJECT_INSTANCE_BEGIN: 140507882943448LOCK_TYPE: KEYLOCK_MODE: WriteLOCK_STATUS: GRANTEDLOCK_DATA: NULLSTART_KEY: NULLEND_KEY: 0000279780000006EXCLUDE_START_KEY: 0BLOCKING_TRANSACTION_NUM: 0BLOCKING_CHECK_READ_TRANSACTION_NUM: 0READ_LOCKED_NUM: 0TINDEX_ID: 10135DATA_SPACE_TYPE: DATA_SPACE_TYPE_USERREPLICATION_GROUP_ID: 257KEY_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_idSELECT 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 |