间隙锁存在需要满足下面几个条件:
(1)索引级别在RR或之上,针对RC以及RU级别是不存在的
(2)非聚簇索引才会存在
然而索引类型的不同也会影响间隙锁锁住数据的范围,唯一索引会锁住上面的范围,但是常规索引则会针对上下返回都会锁住;
在唯一索引的情况下操作:
Session1:
update t set a=600 where x=500;
Session2:
insert into t(x) values(501); --会被锁住
insert into t(x) values(301); --不会被锁住
在非唯一索引的情况下操作:
Session1:
update t set a=600 where x=500;
Session2:
insert into t(x) values(501); --会被锁住
insert into t(x) values(301); --会被锁住
insert into t(x) values(299); --不会被锁住