Documentation Home

27.12.13.1 data_locks 表

data_locks表显示持有和请求的数据锁。有关哪些锁定请求被哪些持有的锁阻止的信息,请参阅 第 27.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表可帮助诊断在并发负载较重时发生的性能问题。对于,请参阅第 15.15.2 节“InnoDB INFORMATION_SCHEMA 事务和锁定信息”InnoDB中对此主题的讨论 。

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_SCHEMA INNODB_TRX

  • THREAD_ID

    创建锁的会话的线程 ID。要获取有关线程的详细信息,请将此列与 THREAD_IDPerformance Schemathreads表的列连接起来。

    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_IDEVENT_ID列与相应父事件表中名称相似的列连接起来。请参阅 第 27.19.2 节,“获取父事件信息”

  • OBJECT_SCHEMA

    包含锁定表的架构。

  • OBJECT_NAME

    锁定表的名称。

  • PARTITION_NAME

    锁定分区的名称,如果有的话; NULL否则。

  • SUBPARTITION_NAME

    锁定的子分区的名称,如果有的话; NULL否则。

  • INDEX_NAME

    锁定索引的名称,如果有的话; NULL否则。

    在实践中,InnoDB总是创建一个索引 ( GEN_CLUST_INDEX),因此 INDEX_NAME是非NULLInnoDB

  • OBJECT_INSTANCE_BEGIN

    锁在内存中的地址。

  • LOCK_TYPE

    锁的类型。

    该值取决于存储引擎。对于 InnoDB,允许的值 RECORD用于行级锁, TABLE用于表级锁。

  • LOCK_MODE

    如何请求锁。

    该值取决于存储引擎。对于 InnoDB,允许的值为 S[,GAP]X[,GAP]IS[,GAP]IX[,GAP]AUTO_INCUNKNOWNAUTO_INCUNKNOWN 指示间隙锁以外的锁定模式 (如果存在)。有关 SXISIX和间隙锁的信息,请参阅第 15.7.1 节,“InnoDB 锁定”

  • LOCK_STATUS

    锁定请求的状态。

    该值取决于存储引擎。对于 InnoDB,允许的值为 GRANTED(持有锁)和 WAITING(正在等待锁)。

  • LOCK_DATA

    与锁关联的数据(如果有)。该值取决于存储引擎。对于,如果是 InnoDB则显示一个值,否则该值为 。对于放置在主键索引上的锁,显示锁定记录的主键值。锁定记录的二级索引值显示为附加在二级索引上的锁的主键值。如果没有主键, 则根据管理规则显示所选唯一索引的键值或唯一 内部行 ID 号LOCK_TYPERECORDNULLLOCK_DATAInnoDBInnoDB 聚簇索引使用(参见 第 15.6.2.1 节,“聚簇索引和二级索引”)。 LOCK_DATA报告在 supremum 伪记录上获取的锁的supremum pseudo-record。如果包含锁定记录的页面不在缓冲池中,因为它是在持有锁时写入磁盘的,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表。

笔记

在 MySQL 8.0.1 之前,表中提供了类似于 Performance Schemadata_locks 表中的 INFORMATION_SCHEMA.INNODB_LOCKS信息,它提供了有关 InnoDB事务已请求但尚未获取的每个锁的信息,以及一个事务持有的每个锁正在阻塞另一个事务的信息. INFORMATION_SCHEMA.INNODB_LOCKS已弃用并从 MySQL 8.0.1 开始删除。 data_locks应该改用。

INNODB_LOCKS和 之间的 区别data_locks

  • 如果一个事务持有锁, INNODB_LOCKS则仅当另一个事务正在等待它时才显示该锁。 data_locks无论是否有任何事务正在等待它,都会显示锁。

  • data_locks表没有对应于LOCK_SPACELOCK_PAGE或 的列LOCK_REC

  • INNODB_LOCKS表需要全局PROCESS权限。该data_locks表需要通常的 Performance Schema 权限 SELECT才能从中选择表。

下表显示了从 INNODB_LOCKS列到 data_locks列的映射。使用此信息将应用程序从一个表迁移到另一个表。

表 27.4 从 INNODB_LOCKS 到 data_locks 列的映射

INNODB_LOCKS 列 data_locks 列
LOCK_ID ENGINE_LOCK_ID
LOCK_TRX_ID ENGINE_TRANSACTION_ID
LOCK_MODE LOCK_MODE
LOCK_TYPE LOCK_TYPE
LOCK_TABLE(组合模式/表名) OBJECT_SCHEMA(架构名称), OBJECT_NAME(表名称)
LOCK_INDEX INDEX_NAME
LOCK_SPACE 没有任何
LOCK_PAGE 没有任何
LOCK_REC 没有任何
LOCK_DATA LOCK_DATA