#### 15.15.2.2 InnoDB 锁定和锁定等待信息

笔记

本节描述了 Performance Schema 公开的锁定信息[`数据锁`](performance-schema-data-locks-table.html)和[`data_lock_waits`](performance-schema-data-lock-waits-table.html)表，它取代了`INFORMATION_SCHEMA` `INNODB_LOCKS`和`INNODB_LOCK_WAITS`MySQL 8.0 中的表。对于用较旧的术语编写的类似讨论`INFORMATION_SCHEMA`表，见[InnoDB 锁定和锁定等待信息](https://dev.mysql.com/doc/refman/5.7/en/innodb-information-schema-understanding-innodb-locking.html)， 在[MySQL 5.7 参考手册](https://dev.mysql.com/doc/refman/5.7/en/).

当事务更新表中的一行，或用`选择更新`,`InnoDB`在该行上建立一个锁列表或队列。相似地，`InnoDB`为表级锁维护一个表上的锁列表。如果第二个事务想要更新行或锁定已被先前事务以不兼容模式锁定的表，`InnoDB`将对该行的锁定请求添加到相应的队列中。对于要由事务获取的锁，必须删除先前进入该行或表的锁队列的所有不兼容的锁请求（这发生在持有或请求这些锁的事务提交或回滚时）。

一个事务可能对不同的行或表有任意数量的锁请求。在任何给定时间，一个事务可能会请求另一个事务持有的锁，在这种情况下，它会被另一个事务阻塞。请求事务必须等待持有阻塞锁的事务提交或回滚。如果一个事务不是在等待一个锁，它就在一个`跑步`状态。如果一个事务正在等待一个锁，它在一个`锁定等待`状态。（这`INFORMATION_SCHEMA` [`INNODB_TRX`](information-schema-innodb-trx-table.html)表指示事务状态值。）

性能模式[`数据锁`](performance-schema-data-locks-table.html)表为每个包含一行或多行`锁定等待`事务，指示阻止其进展的任何锁定请求。该表还包含一行描述给定行或表的待处理锁队列中的每个锁。性能模式[`data_lock_waits`](performance-schema-data-lock-waits-table.html)表显示了一个事务已经持有的哪些锁是其他事务请求的阻塞锁。
