data_locks表
该data_locks表显示了持有和请求的数据锁。有关哪些锁定请求被哪些保持的锁定阻止的信息,请参见“ 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数据收集不同,没有用于控制是否收集数据锁定信息或用于控制数据锁定表大小的系统变量的工具。性能架构收集服务器中已经可用的信息,因此没有内存或CPU开销来生成此信息,也不需要控制其收集的参数。
使用该data_locks表可帮助诊断在高并行负载下发生的性能问题。对于InnoDB,请参见“ 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,要获取有关交易的详细信息,请将此列与表的TRX_ID列连接在一起INFORMATION_SCHEMAINNODB_TRX。THREAD_ID创建锁的会话的线程ID。要获取有关线程的详细信息,请将此列与
THREAD_ID“性能模式”threads表的列连接在一起。THREAD_ID可以与一起使用,EVENT_ID以确定在内存中创建锁定数据结构的事件。(如果数据结构用于存储多个锁,则此事件可能在此特定的锁请求发生之前发生。)EVENT_ID导致锁定的Performance Schema事件。(
THREAD_ID,EVENT_ID)值的元组隐式标识其他性能模式表中的父事件:- 表中的父级等待事件
events_waits_xxx - 表中的父阶段事件
events_stages_xxx - 表中的父语句事件
events_statements_xxx - 在父事务事件
events_transactions_current表
要获取有关父事件的详细信息,请在相应的父事件表中将
THREAD_ID和EVENT_ID列与名称相似的列连接在一起。- 表中的父级等待事件
OBJECT_SCHEMA包含锁定表的架构。
OBJECT_NAME锁定表的名称。
PARTITION_NAME锁定分区的名称(如果有);
NULL除此以外。SUBPARTITION_NAME锁定的子分区的名称(如果有);
NULL除此以外。INDEX_NAME锁定索引的名称(如果有);
NULL除此以外。在实践中,
InnoDB总是创建索引(GEN_CLUST_INDEX),所以INDEX_NAME是不NULL为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,和差距锁,请参阅第15.7.1,“InnoDB的锁定”。LOCK_STATUS锁定请求的状态。
该值取决于存储引擎。对于
InnoDB,允许的值为GRANTED(锁定被保持)和WAITING(锁定正在等待)。LOCK_DATA与锁关联的数据(如果有)。该值取决于存储引擎。例如
InnoDB,如果LOCK_TYPE是RECORD,则显示一个值,否则为NULL。显示了锁定记录的主键值,以表示放置在主键索引上的锁。显示锁定记录的二级索引值,并在二级索引上附加锁的主键值。如果没有主键,则根据控制规则,LOCK_DATA显示所选唯一索引的键值或唯一InnoDB内部行ID号InnoDB聚集索引的使用(请参见“聚集索引和二级索引”)。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)
TRUNCATE TABLE不允许用于该data_locks表。
