MySQL 8.4 Release Notes
17.15.2.2 InnoDB 锁和锁等待信息
当事务更新表中的行或使用SELECT FOR UPDATE
锁定该行时,InnoDB
会为该行建立一个锁定的列表或队列。类似地,InnoDB
也维护了表级别的锁定列表。如果第二个事务想要更新已经被前一个事务锁定的行或表,以不兼容的模式锁定,那么InnoDB
将为该行添加一个锁定请求到对应队列中。为了使事务获取锁定,所有之前进入该行或表锁定队列中的不兼容锁定请求都必须被删除(这发生在持有或请求这些锁定的事务提交或回滚时)。
事务可以对不同的行或表请求任意数量的锁定。在任何给定的时间,事务可能会请求已经被其他事务持有的锁定,在这种情况下,它将被阻塞由该事务持有的锁定的事务。请求锁定的事务必须等待持有阻塞锁定的事务提交或回滚。如果事务不在等待锁定状态,那么它处于RUNNING
状态;如果事务在等待锁定,那么它处于LOCK WAIT
状态。(INFORMATION_ SCHEMA
INNODB_TRX
表中显示事务状态值。)
性能_schema中的data_locks
表中包含每个LOCK WAIT
事务的一行或多行,表示任何阻止其进度的锁请求。此外,该表还包含对某个行或表的锁队列中的每个锁描述。性能_schema中的data_lock_waits
表显示了哪些锁已经被事务持有,阻止其他事务请求的锁。