文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


29.12.13.1 data_locks 表

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

与大多数性能模式数据收集不同,没有仪器可以控制是否收集数据锁信息,也没有系统变量可以控制数据锁表大小。性能模式收集服务器中已经可用的信息,因此没有生成此信息的内存或 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。要获取有关线程的详细信息,请将此列与性能模式 threads 表的 THREAD_ID 列连接起来。

    THREAD_ID 可以与 EVENT_ID 一起使用来确定在内存中创建锁数据结构的事件。(如果数据结构用于存储多个锁,则此事件可能在此特定锁请求发生之前发生。)

  • EVENT_ID

    导致锁的性能模式事件。(THREAD_ID, EVENT_ID) 值的元组隐式地标识其他性能模式表中的父事件

    • events_waits_xxx 表中的父等待事件

    • events_stages_xxx 表中的父阶段事件

    • events_statements_xxx 表中的父语句事件

    • events_transactions_current 表中的父事务事件

    要获取有关父事件的详细信息,请将 THREAD_IDEVENT_ID 列与相应父事件表中同名的列连接起来。请参阅 第 29.19.2 节,“获取父事件信息”

  • OBJECT_SCHEMA

    包含被锁定的表的模式。

  • OBJECT_NAME

    被锁定的表的名称。

  • PARTITION_NAME

    锁定的分区名称(如果有);否则为 NULL

  • SUBPARTITION_NAME

    锁定的子分区名称(如果有);否则为 NULL

  • INDEX_NAME

    锁定的索引名称(如果有);否则为 NULL

    实际上,InnoDB 始终会创建一个索引 (GEN_CLUST_INDEX),因此对于 InnoDB 表,INDEX_NAME 不会是 NULL

  • OBJECT_INSTANCE_BEGIN

    锁在内存中的地址。

  • LOCK_TYPE

    锁的类型。

    该值依赖于存储引擎。对于 InnoDB,允许的值为 RECORD(用于行级锁)和 TABLE(用于表级锁)。

  • LOCK_MODE

    请求锁的方式。

    该值依赖于存储引擎。对于 InnoDB,允许的值为 S[,GAP]X[,GAP]IS[,GAP]IX[,GAP]AUTO_INCUNKNOWN。除 AUTO_INCUNKNOWN 之外的锁模式表示间隙锁(如果有)。有关 SXISIX 和间隙锁的信息,请参见 第 17.7.1 节“InnoDB 锁定”

  • LOCK_STATUS

    锁请求的状态。

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

  • LOCK_DATA

    与锁关联的数据(如果有)。该值依赖于存储引擎。对于 InnoDB,如果 LOCK_TYPERECORD,则会显示值;否则,值为 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 操作。