1、间隙锁(Gap Lock): 锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,也就是避免产生幻读 在RR隔离级别下都支持
2、临键锁(Next-Key Lock): 行锁和间隙锁的组合,同时锁住数据和数据前面的间隙 在RR隔离级别下都支持
默认情况下,InnoDB在repeatable read事务隔离级别运行,InnoDB使用临键锁进行搜索和索引扫描,以防止幻读。分三种情况如下
1、索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁
2、索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,临键锁退化为间隙锁
3、索引上的范围查询(唯一索引),会访问到不满足条件的第一个值为止
我们会在代码演示那里主要演示上面三种情况
注意:间隙锁唯一目的是防止其他事务插入间隙。 间隙锁可以共存(兼容),一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁
如何查看意向锁及行锁的加锁情况,如下
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;