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进行。