InnoDB锁模式
Contents
锁是由事务获取的,以防止并发事务修改甚至读取某些行或行范围。这样做是为了确保并发写操作不会发生冲突。
InnoDB支持多种锁模式。
共享锁和排他锁
两个标准的行级锁是共享锁(S)和排他锁(X)。
获得共享锁以读取行,并允许其他事务读取已锁定的行,但不允许写入已锁定的行。其他事务也可以获取自己的共享锁。
获得排他锁以写入行,并阻止其他事务锁定同一行。它的具体行为取决于隔离级别;默认值(REPEATABLE READ)允许其他事务从独占锁定的行中读取。
意向锁
InnoDB还允许表锁定,并且为了使表级和行级锁定能够优雅地共存,存在一系列称为意向锁的锁。
意向共享锁(IS)表示事务打算设置共享锁。
意向排他锁(IX)表示事务打算设置排他锁。
无论是否授予锁定,都可以总结如下:
- 如果持有任何其他锁(X,S,IX,IS),则不会授予X锁。
- 如果持有X或IX锁,则不会授予S锁。如果持有S或IS锁,则会授予S锁。
- 如果持有X或S锁,则不会授予IX锁。如果持有IX或IS锁,则会授予IX锁。
- 如果持有X锁,则不会授予IS锁。如果持有S、IX或IS锁,则会授予IS锁。
AUTO_INCREMENT 锁
对于自动增量,也需要锁定 - 请参阅InnoDB中的自动增量处理。
间隙锁
使用默认的隔离级别REPEATABLE READ
,并且在MariaDB 10.4之前使用innodb_locks_unsafe_for_binlog变量的默认设置,将使用称为间隙锁定的方法。当InnoDB在记录上设置共享或排他锁定时,实际上是在索引记录上设置。即使没有定义唯一索引,记录也将具有内部InnoDB索引。同时,在索引记录之前保持间隙锁定,以便另一个事务不能在记录和前一个记录之间的间隙中插入新的索引记录。
间隙可以是单个索引值、多个索引值或根本不存在,这取决于索引的内容。
如果语句使用唯一索引的所有列来搜索唯一行,则不使用间隙锁定。
与上面描述的共享和排他意图锁类似,间隙锁可以有许多类型。这些包括共享间隙锁、排他间隙锁、意向共享间隙锁和意向排他间隙锁。
如果设置innodb_locks_unsafe_for_binlog系统变量(直到MariaDB 10.4),或将隔离级别设置为READ COMMITTED
,则禁用间隙锁。