该 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_SCHEMA
INNODB_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
表。