本文参考mysql官方链接:15.7.1 InnoDB Locking

1. 共享锁(S) 和 排它锁(X)

行级锁,其中InnoDB实现了两种S和X,当T1事务持有R行的S锁时,T2事务对R行获取S锁时,可立即获取到,但若T2获取R行的X锁时,将不能立即获取到。

当T1持有R行的X锁时,其他事务获取任意类型锁的请求都会被阻塞,必须等待T1释放X锁

2. 意向锁(Intention Locks)

意向锁是表级锁,其表示了事务稍后会对表中行需要哪种类型的锁(S or X)
因此分为两类: ISIX

  • IS: 意向共享锁 (IS) 表示事务打算在表中的各个行上设置共享锁。
  • IX: 意向排他锁 (IX) 表示事务打算对表中的各个行设置排他锁。

例如,SELECT ... FOR SHARE 设置 IS 锁,SELECT ... FOR UPDATE 设置 IX 锁。

在事务对表中的某行需要获取S(X)锁时,需先获取表的IS(IX)锁,如果获取锁产生冲突,则事务一直等待直到冲突锁被释放。

意向锁的主要目的是表明有人正在(或者将要)锁定表中的一行。

3. 记录锁(Record Locks)

记录锁是对索引记录的锁。例如,SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;防止任何其他事务插入、更新或删除 t.c1 值为 10 的行。

记录锁总是锁定索引记录,即使定义的表没有索引。对于这种情况,InnoDB 创建一个隐藏的聚集索引并使用这个索引来锁定记录。

4. 间隙锁(Gap Locks)

间隙锁是在索引记录之间的间隙上的锁,或在第一条索引记录之前或最后一条索引记录之后的间隙上的锁。例如,SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE;防止其他事务将值 15 插入 t.c1 列,无论该列中是否已经存在任何此类值,因为该范围内所有现有值之间的间隙都已锁定。

间隙锁是性能和并发性之间权衡的一部分,在某些事务隔离级别内,被使用,其它隔离级别可能使用不到

InnoDB 中的间隙锁具有“纯粹的抑制性”,这意味着它们的唯一目的是防止其他事务插入到间隙中。间隙锁可以共存。一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。共享S和独占X间隙锁之间没有区别。它们彼此不冲突,并且执行相同的功能。

5. 临键锁(Next-Key Locks)

临键锁是索引记录上的记录锁和索引记录之前的间隙上的间隙锁组合。辅助记忆: (m, n] = (m, n) + n

但是,有一种特殊情况是(m,+∞],该临键锁仅有间隙锁(m, +∞),无记录锁!
例如:如表中索引记录有仅包含8, 则临键锁有(-∞, 8] 和 (8, +∞)

如果一个会话在索引中的记录 R 上具有共享或排他锁,则另一个会话不能在 R 之前的间隙中插入新的索引记录。(注:R之前的“之前”是根据指索引顺序来定义的)

默认情况下,InnoDB 以 RR(REPEATABLE READ) 事务隔离级别运行。在这种隔离级别情况下,InnoDB 使用 next-key 锁进行搜索和索引扫描,从而防止出现幻行。

6. 插入意向锁(Insert Intention Locks)

插入意向锁是一种在插入行之前由 INSERT 操作设置的间隙锁。(An insert intention lock is a type of gap lock set by INSERT operations prior to row insertion.)

如果插入到同一索引间隙中的多个事务未插入到间隙内的同一位置,则它们无需相互等待。

假设有值为 4 和 7 的索引记录。若存在两个单独事务分别尝试插入值 5 和 6 ,在获得插入行的排他锁之前,每个事务使用插入意向锁锁定 4 和 7 之间的间隙,但不会相互阻塞,因为插入的行是不冲突的。

7. 自动增长锁(AUTO-INC Locks)

AUTO-INC 锁是一种特殊的表级锁,向具有 AUTO_INCREMENT 列的表中插入行时而产生。
(An AUTO-INC lock is a special table-level lock taken by transactions inserting into tables with AUTO_INCREMENT columns. )

在最简单的情况下,如果一个事务正在向表中插入值,则其他任何事务的插入操作都必须等待,以便第一个事务插入的行接收连续的主键值。(ps: maybe batch insert?)
(In the simplest case, if one transaction is inserting values into the table, any other transactions must wait to do their own inserts into that table, so that rows inserted by the first transaction receive consecutive primary key values.)

8. 空间索引的谓词锁(Predicate Locks for Spatial Indexes)

InnoDB 支持包含空间数据的列的空间索引
因其使用频率,不做详细介绍,仅占位