#### 27.12.13.1 数据\_锁表

[](<>)[](<>)

这[`数据锁`](performance-schema-data-locks-table.html)表显示持有和请求的数据锁。有关哪些锁请求被哪些持有的锁阻止的信息，请参阅[第 27.12.13.2 节，“数据\_锁\_等待表”](performance-schema-data-lock-waits-table.html).

数据锁定信息示例：

```
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 开销来生成此信息或需要控制其收集的参数。

使用[`数据锁`](performance-schema-data-locks-table.html)表来帮助诊断在高并发负载期间发生的性能问题。为了`InnoDB`，请参阅此主题的讨论[第 15.15.2 节，“InnoDB 信息\_SCHEMA 交易和锁定信息”](innodb-information-schema-transactions.html).

这[`数据锁`](performance-schema-data-locks-table.html)表有这些列：

-   `引擎`

    持有或请求锁的存储引擎。

-   `ENGINE_LOCK_ID`

    存储引擎持有或请求的锁的 ID。(`ENGINE_LOCK_ID`,`引擎`) 值是唯一的。

    锁定 ID 格式是内部的，随时可能更改。应用程序不应依赖具有特定格式的锁 ID。

-   `ENGINE_TRANSACTION_ID`

    请求锁的事务的存储引擎内部 ID。这可以被认为是锁的所有者，尽管锁可能仍然处于挂起状态，实际上还没有被授予（`LOCK_STATUS='等待中'`）。

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

    为了`InnoDB`, 要获取有关交易的详细信息，请将此列与`TRX_ID`的列`INFORMATION_SCHEMA` [`INNODB_TRX`](information-schema-innodb-trx-table.html)桌子。

-   `THREAD_ID`

    创建锁的会话的线程 ID。要获取有关线程的详细信息，请将此列与`THREAD_ID`性能模式的列[`线程`](performance-schema-threads-table.html)桌子。

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

-   `EVENT_ID`

    导致锁定的性能架构事件。(`THREAD_ID`,`EVENT_ID`) 值隐式标识其他性能模式表中的父事件：

    -   中的父等待事件`events_waits_*`xxx`*`表

    -   中的父阶段事件`events_stages_*`xxx`*`表

    -   中的父语句事件`events_statements_*`xxx`*`表

    -   父事务事件在[`events_transactions_current`](performance-schema-events-transactions-current-table.html)桌子

        要获取有关父事件的详细信息，请加入`THREAD_ID`和`EVENT_ID`在相应的父事件表中具有类似名称的列。看[第 27.19.2 节，“获取父事件信息”](performance-schema-obtaining-parent-events.html).

-   `OBJECT_SCHEMA`

    包含锁定表的架构。

-   `OBJECT_NAME`

    锁定表的名称。

-   `PARTITION_NAME`

    锁定分区的名称（如果有）；`空值`否则。

-   `SUBPARTITION_NAME`

    锁定子分区的名称（如果有）；`空值`否则。

-   `INDEX_NAME`

    锁定索引的名称（如果有）；`空值`否则。

    在实践中，`InnoDB`总是创建一个索引 (`GEN_CLUST_INDEX`）， 所以`INDEX_NAME`是非`空值`为了`InnoDB`表。

-   `OBJECT_INSTANCE_BEGIN`

    锁在内存中的地址。

-   `LOCK_TYPE`

    锁的类型。

    该值取决于存储引擎。为了`InnoDB`, 允许的值为`记录`对于行级锁，`桌子`用于表级锁。

-   `LOCK_MODE`

    如何请求锁定。

    该值取决于存储引擎。为了`InnoDB`, 允许的值为`S[,间隙]`,`X[,间隙]`,`是[,差距]`,`九[,差距]`,`AUTO_INC`， 和`未知`.锁定模式`AUTO_INC`和`未知`指示间隙锁（如果存在）。有关信息`小号`,`X`,`是`,`九`和间隙锁，请参阅[第 15.7.1 节，“InnoDB 锁定”](innodb-locking.html).

-   `LOCK_STATUS`

    锁定请求的状态。

    该值取决于存储引擎。为了`InnoDB`, 允许的值为`的确`（锁定被持有）和`等待`（正在等待锁定）。

-   `LOCK_DATA`

    与锁关联的数据（如果有）。该值取决于存储引擎。为了`InnoDB`，如果`LOCK_TYPE`是`记录`, 否则值为`空值`.锁定记录的主键值显示为放置在主键索引上的锁。锁定记录的二级索引值显示为附加在二级索引上的锁的主键值。如果没有主键，`LOCK_DATA`显示所选唯一索引的键值或唯一`InnoDB`内部行 ID 号，根据管理规则`InnoDB`聚集索引的使用（参见[第 15.6.2.1 节，“聚集索引和二级索引”](innodb-index-types.html)）。`LOCK_DATA`报告“最高伪记录”对于在最高伪记录上采取的锁。如果包含锁定记录的页面不在缓冲池中，因为它在持有锁定时被写入磁盘，`InnoDB`不从磁盘获取页面。反而，`LOCK_DATA`报告`空值`.

    这[`数据锁`](performance-schema-data-locks-table.html)表有这些索引：

-   主键打开 (`ENGINE_LOCK_ID`, `引擎`)

-   索引 (`ENGINE_TRANSACTION_ID`, `引擎`)

-   索引 (`THREAD_ID`, `EVENT_ID`)

-   索引 (`OBJECT_SCHEMA`, `OBJECT_NAME`, `PARTITION_NAME`, `SUBPARTITION_NAME`)

[`截断表`](truncate-table.html)不允许[`数据锁`](performance-schema-data-locks-table.html)桌子。

[](<>)

笔记

在 MySQL 8.0.1 之前，与 Performance Schema 中的信息类似[`数据锁`](performance-schema-data-locks-table.html)表中可用`INFORMATION_SCHEMA.INNODB_LOCKS`表，它提供有关每个锁的信息`InnoDB`事务已请求但尚未获得，并且每个锁由阻塞另一个事务的事务持有。`INFORMATION_SCHEMA.INNODB_LOCKS`自 MySQL 8.0.1 起已弃用并被删除。[`数据锁`](performance-schema-data-locks-table.html)应改为使用。

之间的差异`INNODB_LOCKS`和[`数据锁`](performance-schema-data-locks-table.html)：

-   如果一个事务持有一个锁，`INNODB_LOCKS`仅当另一个事务正在等待它时才显示锁。[`数据锁`](performance-schema-data-locks-table.html)无论是否有任何事务在等待它，都显示锁。

-   这[`数据锁`](performance-schema-data-locks-table.html)表没有对应的列`LOCK_SPACE`, `LOCK_PAGE`， 要么`LOCK_REC`.

-   这`INNODB_LOCKS`表需要全局[`过程`](privileges-provided.html#priv_process)特权。这[`数据锁`](performance-schema-data-locks-table.html)table 需要通常的 Performance Schema 权限[`选择`](privileges-provided.html#priv_select)在要从中选择的表上。

    下表显示了从`INNODB_LOCKS`列到[`数据锁`](performance-schema-data-locks-table.html)列。使用此信息将应用程序从一个表迁移到另一个表。

[](<>)

**表 27.4 来自 INNODB 的映射\_锁定数据\_锁定列**

| INNODB\_锁列 | 数据\_锁列 |
| ---------- | ------ |
| `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` |
