解析幻读

【定义】

幻读是指在同一个事务中,存在前后两次查询同一个范围的数据,但是第二次查询却看到了第一次查询没看到的行,

一般情况下特指事务执行中新增的其他行。

也就是另一个事务新增了满足当前事务查询的行,导致当前事务再次查询结果不一样。

 

【出现条件】

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 一旦再有一个和这个间隙锁冲突的插入语句就造成了死锁

posted @ 2023-02-15 16:38  RookieCoderAdu  阅读(52)  评论(0)    收藏  举报