1、InnoDB存储引擎包含的锁类型
- 共享锁(S锁)和排他锁(X锁)
- 意向锁
- 记录锁
- 间隙锁
- Next-key锁
- 插入意向锁
- Auto-INC 锁
- 空间索引的谓词锁
2、共享锁(S锁)和排他锁(X锁)-- 锁定数据行
共享锁(S锁)和排他锁(X锁),均为**行级别锁定**。
- 共享锁:允许持有锁的事务读取某一行;
- 排他锁:允许持有锁的事务更新或者删除一行;
3、意向锁 – 锁定数据表
1) InnoDB 支持多粒度的锁定,允许行锁和表锁共存。为了实现多粒度锁定,使用了意向锁。
2)意向锁是表级锁,指示事务稍后需要对表中的行使用哪种类型的锁(共享S锁或者排他X锁)。
3)意向锁的分类
-
意向共享锁(IS锁):IS 表示事务打算在表中的个别行上设置 S 锁;
-
意向排他锁(IX锁):IX 表示事务打算在表中的个别行上设置 X 锁;
例如:SELECT … FOR SHARE设置一个IS锁, SELECT … FOR UPDATE设置一个IX锁。
4)在事务可以获得表中某一行上的共享锁之前,它必须首先获得 IS 表级锁;
在事务可以获得表中某一行上的排他锁之前,它必须首先获得 IX 表级锁;
5)表级锁类型兼容如下
- 如果请求的事务与现有锁兼容,则授予该锁;
- 如果请求的事务与现有锁冲突,当前事务将等待,直到冲突的锁被释放。同时,锁请求与现有锁出现冲突,导致死锁而无法授权;
4、记录锁 – 锁定索引
记录锁是对索引记录的锁定。例如:SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; 阻止任何其他事务插入、更新或删除值为 的 t.c1行 10
5、间隙锁 – 锁定数据间隙
间隙锁是锁定索引记录之前的间隙,也可以锁定当前索引记录之前或者之后的间隙。例如1:SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE; 该语句将会在 10~20的范围内添加间隙锁,
阻止新的数据插入到间隙中。例如2:SELECT * FROM child WHERE id = 100;
分析a:如果列 id 具有唯一索引,则仅仅会添加索引记录锁,仅锁定当前数据行;
分析b:如果列 id 没有索引或者具有非唯一索引,则会添加间隙锁,锁定数据行前面的间隙;
6、Next-key锁 = 记录锁 + 间隙锁(两者的组合)
Next-key锁 = 索引记录锁 + 索引记录前面间隙上的间隙锁。使用 Next-key锁进行搜索和索引扫描,
可以防止出现幻读数据。
7、插入意向锁(目的是提前锁定数据插入的间隙)
当执行 insert 操作的时候,当前事务会获取插入意向锁(特殊的间隙锁),同时等待获取独占 X 锁。
8、AUTO-INC锁【表级锁】
当数据主键列使用 AUTO_INCREMENT ,在执行 insert 操作的时候,系统会申请获取 **AUTO-INC 表级锁**。在最简单
的情况下,如果一个事务正向表中插入值,则任何其他事务都必须等待才能执行自己的操作,以便第一个事务插入的行能
够接收连续的主键值。关注:innodb_autoinc_lock_mode 变量控制用于自动增量锁定的算法
9 、空间索引的谓词锁
为了支持带空间索引的表的隔离级别,InnDB 使用谓词锁。