解析幻读
【定义】
幻读是指在同一个事务中,存在前后两次查询同一个范围的数据,但是第二次查询却看到了第一次查询没看到的行,
一般情况下特指事务执行中新增的其他行。
也就是另一个事务新增了满足当前事务查询的行,导致当前事务再次查询结果不一样。
【出现条件】
1.数据库隔离级别为RR(Repeatable Read)可重复读 及以下。
2.当前读。(当前读会生成行锁,但行锁只能锁定存在的行,针对新插入的操作没有限定)
【解决】
可以使用间隙锁(Gap Lock)解决。
【间隙锁】
在一行行扫描的过程中,不仅将给行加上了行锁,还给行两边的空隙,也加上了间隙锁。
比如查询Id从1到2的记录,则生成了3个间隙锁。分别是(-∞,1),(1,2),(2,+∞)。
那么新增Id为3的记录时,违反了间隙锁,则不会成功插入
【间隙锁的缺点】
会影响并发,可能引起死锁。
如果 Session A 加了间隙锁,Session B 再加一个同样的间隙锁,此时不管是 Session A 还是 Session B 一旦再有一个和这个间隙锁冲突的插入语句就造成了死锁
记录编程的点滴,体会学习的乐趣