tencent cloud

TDSQL Boundless

产品动态
产品简介
产品概述
应用场景
产品架构
实例类型
兼容性说明
使用规范建议
自研内核
内核概述
内核版本更新动态
功能类特性
性能类特性
产品计费
计费概述
购买方式
价格详情
续费说明
欠费说明
退费说明
快速入门
创建实例
连接实例
用户指南
数据迁移
数据同步/订阅
实例管理
参数配置
账号管理
安全组
备份与恢复
数据库审计
标签管理
实践教程
Online DDL 的技术演进与使用实践
锁机制解析与问题排查实践
数据智能调度及相关性能优化实践
TDSQL Boundless 选型指南与实践教程
开发指南
开发指南(MySQL 兼容模式)
开发指南(HBase 兼容模式)
性能调优
性能调优概述
SQL 调优
DDL 调优
性能白皮书
性能概述
TPC-C 测试
Sysbench 测试
API 文档
History
Introduction
API Category
Making API Requests
Instance APIs
Security Group APIs
Task APIs
Backup APIs
Rollback APIs
Parameter APIs
Database APIs
Data Types
Error Codes
通用参考
系统原理
SQL 参考
数据库参数说明
TPC-H 基准测试数据模型参考
错误码信息
安全与合规
常见问题
服务协议
服务等级协议
服务条款
隐私政策
数据处理和安全协议
联系我们
词汇表

DATA_LOCKS

PDF
聚焦模式
字号
最后更新时间: 2026-03-26 14:35:18

功能

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
Performance Schema 的内部线程 ID,在 Performance Schema 的生命周期内唯一,可用于可靠地关联 Performance Schema 的各类事件表。
EVENT_ID
bigint unsigned
导致加锁的 Performance Schema 事件 ID。对于 TDStore 为 NULL
OBJECT_SCHEMA
varchar(64)
悲观锁对应的数据库名。
OBJECT_NAME
varchar(64)
悲观锁对应的表名。
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。
PROCESSLIST_ID
bigint unsigned
对应开启该事务的会话连接(session)ID。
NODE_ID
bigint unsigned
开启该事务的 SQLEngine 节点 ID。
NODE_NAME
varchar(64)
开启该事务的 SQLEngine 节点名称。
说明:
TDSQL Boundless 暂未支持在 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: 44
EVENT_ID: NULL
OBJECT_SCHEMA: testdb
OBJECT_NAME: test
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
PROCESSLIST_ID: 2097282
NODE_ID: 2
NODE_NAME: node-1-002
*************************** 2. row ***************************
ENGINE: RocksDB
ENGINE_LOCK_ID: 28681376014270466_0000279780000006
ENGINE_TRANSACTION_ID: 28681376014270466
THREAD_ID: 44
EVENT_ID: NULL
OBJECT_SCHEMA: testdb
OBJECT_NAME: test
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
PROCESSLIST_ID: 1048704
NODE_ID: 1
NODE_NAME: node-1-001
查询示例:
-- 查询所有节点的悲观锁数量
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;

-- 或直接使用tableName databaseName查询相关悲观锁信息
SELECT * FROM performance_schema.data_locks WHERE OBJECT_SCHEMA = 'testdb' AND OBJECT_NAME = 'test';

-- 查询所有节点上,事务 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

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈