MySQL 8.0 数据库原理 InnoDB 锁定和锁定等待信息
笔记
本节描述了由性能模式data_locks
和 data_lock_waits
表公开的锁定信息,它们取代了MySQL 8.0 中的INFORMATION_SCHEMA
INNODB_LOCKS
和 INNODB_LOCK_WAITS
表。有关根据旧INFORMATION_SCHEMA
表编写的类似讨论,请参阅 MySQL 5.7 参考手册中的 InnoDB 锁定和锁定等待信息。
当事务更新表中的一行或用 锁定它时 SELECT FOR UPDATE
,InnoDB
会在该行上建立一个列表或锁定队列。同样, InnoDB
为表级锁维护一个表上的锁列表。如果第二个事务想要更新行或锁定已被先前事务以不兼容模式锁定的表InnoDB
,则将该行的锁定请求添加到相应的队列中。对于要由事务获取的锁,必须删除先前进入该行或表的锁队列的所有不兼容的锁请求(这发生在持有或请求这些锁的事务提交或回滚时)。
一个事务可能对不同的行或表有任意数量的锁请求。在任何给定时间,一个事务可能会请求另一个事务持有的锁,在这种情况下,它会被另一个事务阻塞。请求事务必须等待持有阻塞锁的事务提交或回滚。如果一个事务没有等待锁,它就处于一个RUNNING
状态。如果一个事务正在等待一个锁,它就处于一个LOCK WAIT
状态。(该INFORMATION_SCHEMA
INNODB_TRX
表指示事务状态值。)
Performance Schemadata_locks
表为每个LOCK WAIT
事务保存一个或多个行,指示阻止其进展的任何锁定请求。该表还包含一行描述给定行或表的待处理锁队列中的每个锁。Performance Schema data_lock_waits
表显示了一个事务已经持有的哪些锁是其他事务请求的阻塞锁。