Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


29.12.13.1 数据锁定表

数据锁定表(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_IDENGINE组合值是唯一的。

    锁定ID格式内部且可能随时更改。应用程序不应依赖于锁定的特定格式。

  • ENGINE_TRANSACTION_ID

    存储引擎内部的交易ID,该交易请求了锁定。这可以被认为是锁定的所有者,尽管锁可能仍在等待中(LOCK_STATUS='WAITING')。

    如果事务尚未执行任何写操作(仍被认为是只读的),该列包含用户不应尝试解释的内部数据。否则,该列为事务ID。

    对于InnoDB,要获取关于事务的详细信息,请将此列与INNODB_TRX表中的TRX_ID列进行连接。

  • THREAD_ID

    创建锁定的会话线程ID。要获取关于线程的详细信息,请将此列与性能方案threads表中的THREAD_ID列进行连接。

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

  • EVENT_ID

    导致锁定的性能方案事件。THREAD_IDEVENT_ID组合值隐式标识其他性能方案表中的父事件:

    要获取关于父事件的详细信息,请将THREAD_IDEVENT_ID列与相应父事件表中的类似名称的列进行连接。请参阅第29.19.2节,“获取父事件信息”

  • OBJECT_SCHEMA

    包含锁定的表的模式名称。

  • OBJECT_NAME

    被锁定的表名。

  • PARTITION_NAME

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

  • SUBPARTITION_NAME

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

  • INDEX_NAME

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

    实际上,InnoDB 总是创建一个索引(GEN_CLUST_INDEX),所以 INDEX_NAME 对于 InnoDB 表格永远不会为空。

  • 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 Locking”

  • LOCK_STATUS

    锁定请求的状态。

    值是存储引擎依赖的。对于 InnoDB,允许的值为 GRANTED(已获得锁)和 WAITING(正在等待锁定)。

  • LOCK_DATA

    与锁相关的数据,如果有的话。值是存储引擎依赖的。对于 InnoDB,如果 LOCK_TYPERECORD,则显示一个值;否则为空。主键值显示在锁定记录的主键索引上。对于二级索引上的锁定记录,显示的是主键值和二级索引值。如果没有主键,LOCK_DATA 显示二级索引的关键值或 InnoDB 内部行ID号,根据使用 InnoDB 集群索引规则(请参阅第17.6.2.1节,“Clustered and Secondary Indexes”)决定的。LOCK_DATA 报告“supremum pseudo-record”用于在锁定上下文中获取锁定的锁定记录。如果页面包含被锁定的记录而且该页面不在缓冲池中(因为它在持有锁定时被写入到磁盘),InnoDB 不会从磁盘读取页面。相反,LOCK_DATA 报告空值。

data_locks有这些索引:

  • 主键在(ENGINE_LOCK_IDENGINE)上

  • 索引在(ENGINE_TRANSACTION_IDENGINE)上

  • 索引在(THREAD_IDEVENT_ID)上

  • 索引在(OBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAME)上

TRUNCATE TABLE 不允许对表data_locks进行。