关于RR级别下可以避免幻读

来源:3-17 锁模块之RR如何避免幻读

YogurtJ

2020-03-06

老师您好,我将您事务隔离级别与避免幻读的课程反复看了几遍还是有一些疑问

请问老师可否举一个幻读的具体例子,例子为:

在RC级别下,该幻读情况无法避免

在RR级别下,通过加next-key锁的方式避免了该幻读

我个人暂且认为在RR级别下,可以避免看到幻行,解决了不可重复读的问题,但是我并不觉得,能够解决幻读的问题,
经过我自己的试验,比如说,在RR级别下我A,B都开启了 事务,

A先快照读select * from person; 得到了id 1-5 的数据。
B向表中 添加了 id 为6的数据,然后B提交事务
随后 A 对 id为6的数据进行更新,是可以更新的到的
(出现了幻读问题,仿佛自己出现了幻觉)

我认为这个属于幻读问题,因此不觉得RR级别下,可以避免幻读

因此,希望老师可以举出某个例子,在RC级别下会出现幻读
而在RR级别下这个幻读被避免了

希望祥仔可以解答疑惑,非常感谢!

写回答

1回答

翔仔

2020-03-06

同学好,

请问老师可否举一个幻读的具体例子,例子为:

在RC级别下,该幻读情况无法避免

在RR级别下,通过加next-key锁的方式避免了该幻读

这个例子,可以用我课程里面这个正好避免了幻读的RR例子来试一下就可以了呀。。

此外,RR确实不能全部避免幻读,课程表述这块,当时我举的例子是正好能够避免幻读的情况,主要想表达的是RR并非完全避免不了幻读,这是55开的情况,后来可能课程标题等原因以及当时没有添加另外一种避免不了幻读的情况的原因出现了误解,后续等我先完成目前新课的更新后,再来申请对这部分知识的修正和更新。

另外一种无法避免RR幻读的例子可以详见这个

http://mysql.taobao.org/monthly/2017/06/07/

实际开发的过程中,一般会在程序执行的地方,对并发方法的同一条记录加上同步锁,所以一般情况下也不会出现幻读的情况,请知悉

1
21
Hankong
回复
YogurtJ
你这个case里面,即便你不加for update,也不会幻读吧,b事务的ID大于q事务,你a的读语句不加for update 也可以通过mvcc避免幻读吧。
2023-11-28
共21条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8427 学习 · 1870 问题

查看课程