#### 27.12.13.2 数据\_锁\_等待表

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

这[`data_lock_waits`](performance-schema-data-lock-waits-table.html)表实现了一个多对多的关系，显示了哪些数据锁请求在[`数据锁`](performance-schema-data-locks-table.html)表被哪些持有的数据锁阻塞[`数据锁`](performance-schema-data-locks-table.html)桌子。已锁定[`数据锁`](performance-schema-data-locks-table.html)出现在[`data_lock_waits`](performance-schema-data-lock-waits-table.html)仅当他们阻止某些锁定请求时。

此信息使您能够了解会话之间的数据锁依赖关系。该表不仅公开了会话或事务正在等待哪个锁，还公开了当前持有该锁的会话或事务。

数据锁等待信息示例：

```
mysql> SELECT * FROM performance_schema.data_lock_waits\G
*************************** 1. row ***************************
                          ENGINE: INNODB
       REQUESTING_ENGINE_LOCK_ID: 140211201964816:2:4:2:140211086465800
REQUESTING_ENGINE_TRANSACTION_ID: 1555
            REQUESTING_THREAD_ID: 47
             REQUESTING_EVENT_ID: 5
REQUESTING_OBJECT_INSTANCE_BEGIN: 140211086465800
         BLOCKING_ENGINE_LOCK_ID: 140211201963888:2:4:2:140211086459880
  BLOCKING_ENGINE_TRANSACTION_ID: 1554
              BLOCKING_THREAD_ID: 46
               BLOCKING_EVENT_ID: 12
  BLOCKING_OBJECT_INSTANCE_BEGIN: 140211086459880
```

与大多数 Performance Schema 数据收集不同，没有用于控制是否收集数据锁定信息的工具或用于控制数据锁定表大小的系统变量。Performance Schema 收集服务器中已经可用的信息，因此没有内存或 CPU 开销来生成此信息或需要控制其收集的参数。

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

因为列在[`data_lock_waits`](performance-schema-data-lock-waits-table.html)表与表中的相似[`数据锁`](performance-schema-data-locks-table.html)表，这里的列描述是缩写的。有关更详细的列说明，请参阅[第 27.12.13.1 节，“数据\_锁表”](performance-schema-data-locks-table.html).

这[`data_lock_waits`](performance-schema-data-lock-waits-table.html)表有这些列：

-   `引擎`

    请求锁定的存储引擎。

-   `REQUESTING_ENGINE_LOCK_ID`

    存储引擎请求的锁的 ID。要获取有关锁的详细信息，请将此列与`ENGINE_LOCK_ID`的列[`数据锁`](performance-schema-data-locks-table.html)桌子。

-   `REQUESTING_ENGINE_TRANSACTION_ID`

    请求锁的事务的存储引擎内部 ID。

-   `REQUESTING_THREAD_ID`

    请求锁定的会话的线程 ID。

-   `REQUESTING_EVENT_ID`

    在请求锁定的会话中导致锁定请求的性能架构事件。

-   `REQUESTING_OBJECT_INSTANCE_BEGIN`

    请求的锁在内存中的地址。

-   `BLOCKING_ENGINE_LOCK_ID`

    阻塞锁的 ID。要获取有关锁的详细信息，请将此列与`ENGINE_LOCK_ID`的列[`数据锁`](performance-schema-data-locks-table.html)桌子。

-   `BLOCKING_ENGINE_TRANSACTION_ID`

    持有阻塞锁的事务的存储引擎内部 ID。

-   `BLOCKING_THREAD_ID`

    持有阻塞锁的会话的线程 ID。

-   `BLOCKING_EVENT_ID`

    在持有它的会话中导致阻塞锁的性能模式事件。

-   `BLOCKING_OBJECT_INSTANCE_BEGIN`

    阻塞锁在内存中的地址。

    这[`data_lock_waits`](performance-schema-data-lock-waits-table.html)表有这些索引：

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

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

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

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

-   索引 (`REQUESTING_THREAD_ID`, `REQUESTING_EVENT_ID`)

-   索引 (`BLOCKING_THREAD_ID`, `BLOCKING_EVENT_ID`)

[`截断表`](truncate-table.html)不允许[`data_lock_waits`](performance-schema-data-lock-waits-table.html)桌子。

[](<>)

笔记

在 MySQL 8.0.1 之前，与 Performance Schema 中的信息类似[`data_lock_waits`](performance-schema-data-lock-waits-table.html)表中可用`INFORMATION_SCHEMA.INNODB_LOCK_WAITS`表，提供有关每个被阻止的信息`InnoDB`事务，指示它已请求的锁以及阻塞该请求的任何锁。`INFORMATION_SCHEMA.INNODB_LOCK_WAITS`自 MySQL 8.0.1 起已弃用并被删除。[`data_lock_waits`](performance-schema-data-lock-waits-table.html)应改为使用。

这些表在所需权限方面有所不同：`INNODB_LOCK_WAITS`表需要全局[`过程`](privileges-provided.html#priv_process)特权。这[`data_lock_waits`](performance-schema-data-lock-waits-table.html)table 需要通常的 Performance Schema 权限[`选择`](privileges-provided.html#priv_select)在要从中选择的表上。

下表显示了从`INNODB_LOCK_WAITS`列到[`data_lock_waits`](performance-schema-data-lock-waits-table.html)列。使用此信息将应用程序从一个表迁移到另一个表。

[](<>)

**表 27.5 来自 INNODB 的映射\_锁\_等待数据\_锁\_等待列**

| INNODB\_锁\_等待栏 | 数据\_锁\_等待列 |
| -------------- | ---------- |
| `REQUESTING_TRX_ID` | `REQUESTING_ENGINE_TRANSACTION_ID` |
| `REQUESTED_LOCK_ID` | `REQUESTING_ENGINE_LOCK_ID` |
| `BLOCKING_TRX_ID` | `BLOCKING_ENGINE_TRANSACTION_ID` |
| `BLOCKING_LOCK_ID` | `BLOCKING_ENGINE_LOCK_ID` |
