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