29.12.13.1 数据锁定表
数据锁定表(data_locks
)显示了数据锁定的持有和请求情况。关于哪些锁定请求被哪些持有的锁定阻塞的信息,请参阅第29.12.13.2节,“数据锁定等待表”。
示例数据锁定信息:
mysql> SELECT * FROM performance_schema.data_locks\G
*************************** 1. row ***************************
ENGINE: INNODB
ENGINE_LOCK_ID: 139664434886512:1059:139664350547912
ENGINE_TRANSACTION_ID: 2569
THREAD_ID: 46
EVENT_ID: 12
OBJECT_SCHEMA: test
OBJECT_NAME: t1
PARTITION_NAME: NULL
SUBPARTITION_NAME: NULL
INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 139664350547912
LOCK_TYPE: TABLE
LOCK_MODE: IX
LOCK_STATUS: GRANTED
LOCK_DATA: NULL
*************************** 2. row ***************************
ENGINE: INNODB
ENGINE_LOCK_ID: 139664434886512:2:4:1:139664350544872
ENGINE_TRANSACTION_ID: 2569
THREAD_ID: 46
EVENT_ID: 12
OBJECT_SCHEMA: test
OBJECT_NAME: t1
PARTITION_NAME: NULL
SUBPARTITION_NAME: NULL
INDEX_NAME: GEN_CLUST_INDEX
OBJECT_INSTANCE_BEGIN: 139664350544872
LOCK_TYPE: RECORD
LOCK_MODE: X
LOCK_STATUS: GRANTED
LOCK_DATA: supremum pseudo-record
与大多数性能方案数据收集不同,没有用于控制是否收集数据锁定信息的工具,也没有系统变量来控制数据锁定表的大小。性能方案收集的是服务器已经存在的信息,因此没有生成此信息或需要参数来控制其收集的内存或CPU开销。
使用data_locks
表来帮助诊断在高并发负载期间发生的性能问题。对于InnoDB,请参阅第17.15.2节,“InnoDB INFORMATION_SCHEMA事务和锁定信息”。
数据锁定表(data_locks
)有这些列:
-
ENGINE
持有或请求的锁定的存储引擎。
-
ENGINE_LOCK_ID
存储引擎持有的或请求的锁定ID。
ENGINE_LOCK_ID
和ENGINE
组合值是唯一的。锁定ID格式内部且可能随时更改。应用程序不应依赖于锁定的特定格式。
-
ENGINE_TRANSACTION_ID
存储引擎内部的交易ID,该交易请求了锁定。这可以被认为是锁定的所有者,尽管锁可能仍在等待中(
LOCK_STATUS='WAITING'
)。如果事务尚未执行任何写操作(仍被认为是只读的),该列包含用户不应尝试解释的内部数据。否则,该列为事务ID。
对于InnoDB,要获取关于事务的详细信息,请将此列与
INNODB_TRX
表中的TRX_ID
列进行连接。 -
THREAD_ID
创建锁定的会话线程ID。要获取关于线程的详细信息,请将此列与性能方案
threads
表中的THREAD_ID
列进行连接。THREAD_ID
可以与事件表中的EVENT_ID
一起使用,以确定在内存中创建了锁定数据结构的事件。该事件可能在此特定的锁定请求之前发生,如果数据结构用于存储多个锁定的话。 -
EVENT_ID
导致锁定的性能方案事件。
THREAD_ID
和EVENT_ID
组合值隐式标识其他性能方案表中的父事件:要获取关于父事件的详细信息,请将
THREAD_ID
和EVENT_ID
列与相应父事件表中的类似名称的列进行连接。请参阅第29.19.2节,“获取父事件信息”。 -
OBJECT_SCHEMA
包含锁定的表的模式名称。
-
OBJECT_NAME
被锁定的表名。
-
PARTITION_NAME
如果有的话,锁定分区的名称;否则为
NULL
。 -
SUBPARTITION_NAME
锁定子分区的名称,如果有的话;否则为空。
-
INDEX_NAME
如果有的话,锁定的索引名称;否则为空。
实际上,
InnoDB
总是创建一个索引(GEN_CLUST_INDEX
),所以INDEX_NAME
对于InnoDB
表格永远不会为空。 -
OBJECT_INSTANCE_BEGIN
内存中的锁定地址。
-
LOCK_TYPE
锁定的类型。
值是存储引擎依赖的。对于
InnoDB
,允许的值为RECORD
用于行级锁定,TABLE
用于表级锁定。 -
LOCK_MODE
锁定的请求方式。
值是存储引擎依赖的。对于
InnoDB
,允许的值为S[,GAP]
,X[,GAP]
,IS[,GAP]
,IX[,GAP]
,AUTO_INC
和UNKNOWN
。锁定模式除了AUTO_INC
和UNKNOWN
之外,如果存在,则表示间隙锁定。关于S
,X
,IS
,IX
和间隙锁定的信息,请参考第17.7.1节,“InnoDB Locking”。 -
LOCK_STATUS
锁定请求的状态。
值是存储引擎依赖的。对于
InnoDB
,允许的值为GRANTED
(已获得锁)和WAITING
(正在等待锁定)。 -
LOCK_DATA
与锁相关的数据,如果有的话。值是存储引擎依赖的。对于
InnoDB
,如果LOCK_TYPE
为RECORD
,则显示一个值;否则为空。主键值显示在锁定记录的主键索引上。对于二级索引上的锁定记录,显示的是主键值和二级索引值。如果没有主键,LOCK_DATA
显示二级索引的关键值或InnoDB
内部行ID号,根据使用InnoDB
集群索引规则(请参阅第17.6.2.1节,“Clustered and Secondary Indexes”)决定的。LOCK_DATA
报告“supremum pseudo-record”用于在锁定上下文中获取锁定的锁定记录。如果页面包含被锁定的记录而且该页面不在缓冲池中(因为它在持有锁定时被写入到磁盘),InnoDB
不会从磁盘读取页面。相反,LOCK_DATA
报告空值。
表data_locks
有这些索引:
-
主键在(
ENGINE_LOCK_ID
,ENGINE
)上 -
索引在(
ENGINE_TRANSACTION_ID
,ENGINE
)上 -
索引在(
THREAD_ID
,EVENT_ID
)上 -
索引在(
OBJECT_SCHEMA
,OBJECT_NAME
,PARTITION_NAME
,SUBPARTITION_NAME
)上
TRUNCATE TABLE
不允许对表data_locks
进行。