功能
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: RocksDBREQUESTING_ENGINE_LOCK_ID: 28681541555060779_[00002797,00002798)REQUESTING_ENGINE_TRANSACTION_ID: 28681541555060779REQUESTING_THREAD_ID: 0REQUESTING_EVENT_ID: 0REQUESTING_OBJECT_INSTANCE_BEGIN: 139759771095568BLOCKING_ENGINE_LOCK_ID: 28681535313936395_0000279780000001BLOCKING_ENGINE_TRANSACTION_ID: 28681535313936395BLOCKING_THREAD_ID: 0BLOCKING_EVENT_ID: 0BLOCKING_OBJECT_INSTANCE_BEGIN: 139759768476120TINDEX_ID: 10135DATA_SPACE_TYPE: DATA_SPACE_TYPE_USERREPLICATION_GROUP_ID: 257KEY_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';