MySQL 8.4 发行说明
当事务更新表中的一行,或使用 SELECT FOR UPDATE
锁定它时,InnoDB
会在该行上建立一个锁列表或队列。类似地,InnoDB
会为表级锁维护一个表上的锁列表。如果第二个事务想要更新或锁定先前事务以不兼容模式锁定的行或表,InnoDB
会将该行的锁请求添加到相应的队列中。为了使事务获取锁,必须删除先前输入该行或表的锁队列中的所有不兼容的锁请求(当持有或请求这些锁的事务提交或回滚时,就会发生这种情况)。
一个事务可能对不同的行或表有任意数量的锁请求。在任何给定时间,一个事务都可能请求另一个事务持有的锁,在这种情况下,它会被另一个事务阻塞。请求事务必须等待持有阻塞锁的事务提交或回滚。如果事务没有等待锁,则它处于 RUNNING
状态。如果事务正在等待锁,则它处于 LOCK WAIT
状态。(INFORMATION_SCHEMA
INNODB_TRX
表指示事务状态值。)
性能架构 data_locks
表为每个 LOCK WAIT
事务保存一行或多行,指示阻止其进程的所有锁请求。此表还包含一行,描述给定行或表的待处理锁队列中的每个锁。性能架构 data_lock_waits
表显示了哪些事务已持有的锁正在阻塞其他事务请求的锁。