- 共享(S)和独占(X)锁
- 意向锁
- 记录锁(Record Locks)
- 间隙锁
- Next-key锁
- 插入意向锁
- AUTO-INC锁
共享(S)和独占(X)锁
共享锁和独占锁都是标准的行级锁,
- 共享锁允许持有锁的事务进行读操作
- 独占锁允许持有锁的事务进行惊醒更新或删除操作
意向锁
InnoDB支持多粒度锁允许表锁和行锁共存。举个例子类似于LOCK TABLES … WRITE需要在指定表上设置一个独占锁。InnoDB使用意向锁来实现这种多粒度锁。意向锁是表级别锁,用来表示在事务中的表中某一行需要设置哪种类型的锁,
- 意向共享锁(IS)表示事务意图在表中的单个行上设置共享锁
- 意向独占锁表(IX)示事务意图在表中的单个行上设置独占锁
意向锁协议如下
- 在一个事务中获取表中行上的共享锁之前,它必须先获取一个IS锁或更强的锁
- 在一个事务中获取表中行上的排它锁之前,它必须先获取一个IX锁
表级锁的类型的兼容性如下表所示:
| X | IX | S | IS |
|---|---|---|---|
| X | 冲突 | 冲突 | 冲突 |
| IX | 冲突 | 兼容 | 冲突 |
| S | 冲突 | 冲突 | 兼容 |
| IS | 冲突 | 兼容 | 兼容 |
意向锁的主要目的是显示表中某一行正在被锁定,使会话可以直接从表中获取表中是否有行锁,而不需要遍历所有行去查询是否有行锁。
记录锁
记录锁是会在索引记录上的加的锁。
即使表中没有索引,InnoDB会创建一个隐藏的聚集索引并使用此索引进行记录锁定
例如: SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;可以防止此记录被其它事务更改。
间隙锁
间隙锁是对索引记录之间(或者是第一个索引记录或者最后一个索引记录之前)的间隙所加的锁,
例如: SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE; 阻止其它事务向表中插入 10-20之间的记录
- 间隙锁可能跨越单个或多个索引值,也可能是空的。
- 间隙锁是性能和并发性之间折中。
- 对于使用唯一索引可以搜索唯一行的语句,不需要使用间隙锁
- 间隙S锁和间隙X锁可以被不同的事务同时持有(这样做的原因是如果从索引中清除记录,则必须合并由不同事务记录保存的间隙锁)
- 间隙锁只会禁止其它事务进入间隙而不会阻止其它事务在同一个间隙中获取间隙锁,也就是说间隙X锁和间隙S锁的作用是一样的
Next-Key锁
Next-Key锁实际上是记录锁和间隙锁的组合。在REPEATABLE READ事务隔离级别下,InnoDB使用Next-Key锁进行搜索和扫描索引,可以防止幻读。
插入意向锁
插入意向锁是INSERT操作在行插入之前设置的一种间隙锁。插入意向锁保证了一个事务在执行INSERT操作时不需要等待其它没有在此间隙中相同位置执行INSERT操作的其它事务。
AUTO-INC锁
AUTO-INC锁是事务插入自增列时使用的一种特殊的表级别锁。简单来说,就是一个事务在执行INSERT操作时,则其它事务在执行INSERT之前都必须等待,以便被第一个事务插入的行接收到的是连续的主键值。