data_locks
表显示已持有的数据锁和请求的数据锁。有关哪些锁请求被哪些已持有锁阻塞的信息,请参见 第 29.12.13.2 节,“data_lock_waits 表”。
示例数据锁信息
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
与大多数 Performance Schema 数据收集不同,没有用于控制是否收集数据锁信息或用于控制数据锁表大小的工具。Performance Schema 收集服务器中已经可用的信息,因此没有内存或 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
之外的锁模式表示间隙锁(如果有)。有关S
、X
、IS
、IX
和间隙锁的信息,请参阅 第 17.7.1 节,“InnoDB 锁定”。LOCK_STATUS
锁请求的状态。
该值取决于存储引擎。对于
InnoDB
,允许的值为GRANTED
(持有锁)和WAITING
(正在等待锁)。LOCK_DATA
与锁关联的数据(如果有)。该值取决于存储引擎。对于
InnoDB
,如果LOCK_TYPE
为RECORD
,则会显示一个值,否则该值为NULL
。锁定记录的主键值会针对放置在主键索引上的锁显示。锁定记录的二级索引值会针对放置在二级索引上的锁显示,并附加主键值。如果没有主键,LOCK_DATA
会根据控制InnoDB
聚簇索引使用的规则显示所选唯一索引的键值或唯一的InnoDB
内部行 ID 号(请参阅 第 17.6.2.1 节,“聚簇索引和二级索引”)。LOCK_DATA
会针对对最高伪记录所采取的锁报告 “最高伪记录”。如果包含锁定记录的页不在缓冲池中(因为在持有锁时已将其写入磁盘),则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
) 上的索引
不允许对 data_locks
表执行 TRUNCATE TABLE
。