14.16.2.2 InnoDB 锁定和锁定 await 信息

当事务更新 table 中的一行或使用SELECT FOR UPDATE对其进行锁定时,InnoDB在该行上构建一个锁列 table 或锁队列。类似地,InnoDB维护 table 级锁的 table 列 table。如果第二个事务想要以不兼容的模式更新行或锁定已经由先前事务锁定的 table,则InnoDB将对该行的锁定请求添加到相应的队列中。为了使事务获取锁,必须删除先前 Importing 到该行或 table 的锁队列中的所有不兼容锁请求(在持有或请求这些锁的事务提交或回滚时发生)。

事务可以具有针对不同的行或 table 的任意数量的锁定请求。在任何给定的时间,一个事务可以请求另一个事务持有的锁,在这种情况下,该事务被另一个事务阻止。请求事务必须 await 持有阻塞锁的事务提交或回滚。如果事务不 await 锁,则它处于RUNNING状态。如果事务正在 await 锁,则它处于LOCK WAIT状态。 (INFORMATION_SCHEMA INNODB_TRXtable 指示事务状态值。)

INNODB_LOCKStable 为每个LOCK WAIT事务保留一个或多个行,指示任何阻止其进度的锁定请求。该 table 还包含一行,描述给定行或 table 的未决锁队列中的每个锁。 INNODB_LOCK_WAITStable 显示了某个事务已持有的锁正在阻止其他事务请求的锁。