该 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 格式是内部的,可能随时更改。应用程序不应依赖锁 ID 具有特定格式。
-
ENGINE_TRANSACTION_ID请求锁的交易的存储引擎内部 ID。这可以被认为是锁的所有者,尽管锁可能仍然是待定的,尚未授予 (
LOCK_STATUS='WAITING')。如果交易尚未执行任何写操作(仍被认为是只读的),则该列包含内部数据,用户不应尝试解释。否则,该列是交易 ID。
对于
InnoDB,要获取交易的详细信息,请将该列与INFORMATION_SCHEMAINNODB_TRX表的TRX_ID列进行连接。 -
THREAD_ID创建锁的会话的线程 ID。要获取线程的详细信息,请将该列与 Performance Schema
threads表的THREAD_ID列进行连接。THREAD_ID可以与EVENT_ID一起使用,以确定在内存中创建锁数据结构的事件。(该事件可能发生在锁请求之前,如果数据结构用于存储多个锁。) -
EVENT_ID导致锁的 Performance Schema 事件。 (
THREAD_ID,EVENT_ID) 值隐式标识其他 Performance Schema 表中的父事件:-
父等待事件在
events_waits_表中xxx -
父阶段事件在
events_stages_表中xxx -
父语句事件在
events_statements_表中xxx -
父事务事件在
events_transactions_current表中
要获取父事件的详细信息,请将
THREAD_ID和EVENT_ID列与相应父事件表中的同名列进行连接。请参见 第 29.19.2 节,“获取父事件信息”。 -
-
OBJECT_SCHEMA锁定的表所在的模式。
-
OBJECT_NAME锁定的表的名称。
-
PARTITION_NAME锁定的分区名称,如果有;否则为
NULL。 -
SUBPARTITION_NAME锁定的子分区名称,如果有;否则为
NULL。 -
INDEX_NAME锁定的索引名称,如果有;否则为
NULL。实际上,
InnoDB总是创建一个索引(GEN_CLUST_INDEX),因此INDEX_NAME对于InnoDB表不是NULL。 -
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之外,均表示 gap 锁,如果存在。有关S、X、IS、IX和 gap 锁的信息,请参阅 第 17.7.1 节,“InnoDB 锁定”。 -
LOCK_STATUS锁请求的状态。
该值取决于存储引擎。对于
InnoDB,允许的值是GRANTED(锁被持有)和WAITING(锁正在等待)。 -
LOCK_DATA锁关联的数据,如果有。该值取决于存储引擎。对于
InnoDB,如果LOCK_TYPE是RECORD,则显示锁定的记录的主键值,否则为NULL。如果没有主键,则LOCK_DATA显示唯一索引的键值或InnoDB内部行 ID 号,根据InnoDB聚集索引使用规则(参阅 第 17.6.2.1 节,“聚集索引和次要索引”)。LOCK_DATA报告 “supremum 伪记录” 对于 supremum 伪记录的锁。如果锁定的记录所在的页面不在缓冲池中,因为它在锁定时被写入磁盘,InnoDB不会从磁盘中获取该页面。相反,LOCK_DATA报告NULL。
该 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 表。