MariaDB InnoDB基本介绍
InnoDB锁定模式
事务获取锁,以防止并发事务修改甚至读取某些行或行范围。这样做是为了确保并发写入操作不会冲突。
共享锁(S)和排他锁(X)
两种标准的行级锁是共享锁(S)和排他锁(X)
获取共享锁以读取行,并允许其他事务读取锁定的行,但不能写入锁定的行。其他事务也可能获取自己的共享锁。
获得排他锁以写入一行,并阻止其他事务锁定同一行。它的具体行为取决于隔离级别;默认值(REPEATABLE READ可重复读),允许其他事务从排他锁定的行读取。
意向锁
InnoDB还允许表锁定,并允许表和行级别的锁定优雅地共存,存在一系列称为意图锁的锁。
意向共享锁(IS)表示事务打算设置共享锁。
意向排他锁(IX)表示事务打算设置排他锁。
是否授予锁定可以总结如下:
- 如果持有其他任何锁(X,S,IX,IS),则不授予X锁。
- 如果持有X或IX锁,则不授予S锁。如果持有S或IS锁,则将授予此权限。
- 如果持有X或S锁,则不授予IX锁。如果持有IX或IS锁,则将授予此权限。
- 如果持有X锁,则不授予IS锁。如果持有S,IX或IS锁,则将授予此权限。
间隙锁
使用innodb_locks_unsafe_for_binlog的默认设置和默认隔离级别REPEATABLE READ,将使用一种称为间隙锁定的方法。当InnoDB在记录上设置共享或排他锁时,它实际上在索引记录上。记录将具有内部InnoDB索引,即使它们没有定义唯一索引也是如此。同时,在索引记录之前的间隙上保持了锁定,因此另一个事务无法在该记录与先前记录之间的间隙中插入新的索引记录。
间隙可以是一个索引值,也可以是多个索引值,或者根本不存在,这取决于索引的内容。如果一条语句使用唯一索引的所有列来搜索唯一行,则不使用间隙锁定。
类似于上述共享和排他意图锁,可以有多种类型的间隙锁。这些包括共享间隙锁,排他间隙锁,意图共享间隙锁和意图排他间隙锁。
如果设置了innodb_locks_unsafe_for_binlog系统变量,或者隔离级别设置为READ COMMITTED,则禁用间隙锁。
复制请注明出处,在世界中挣扎的灰太狼