排它锁之行锁、间隙锁、后码锁 (3)

事务3添加的 id = 6,number = 8,这条数据是在 (3, 8) 的区间里边,所以会被阻塞;
事务4添加的 id = 8,number = 8,这条数据则是在(8, 12)区间里边,所以不会被阻塞;
事务7的修改语句相当于在 (3, 8) 的区间里边插入一条数据,所以也被阻塞了。

结论

在普通索引列上,不管是何种查询,只要加锁,都会产生间隙锁,这跟唯一索引不一样

在普通索引跟唯一索引中,数据间隙的分析,数据行是优先根据普通索引排序,再根据唯一索引排序

后码锁(Next-key Lock)

后码锁(,是记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间。

注:Next-key Lock的主要目的,也是为了避免幻读(Phantom Read)。如果把事务的隔离级别降级为RC,Next-key Lock则也会失效。

总结

记录锁、间隙锁、后码锁,都属于排它锁;

记录锁就是锁住一行记录;

间隙锁只有在事务隔离级别 RR 中才会产生;

唯一索引只有锁住多条记录或者一条不存在的记录的时候,才会产生间隙锁,指定给某条存在的记录加锁的时候,只会加记录锁,不会产生间隙锁;

普通索引不管是锁住单条,还是多条记录,都会产生间隙锁;

间隙锁会封锁该条记录相邻两个键之间的空白区域,防止其它事务在这个区域内插入、修改、删除数据,这是为了防止出现 幻读 现象;

普通索引的间隙,优先以普通索引排序,然后再根据主键索引排序;

事务级别是RC(读已提交)级别的话,间隙锁将会失效。

资料

Java问题收集

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpswgz.html