请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

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

在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回答

同学好,

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

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

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

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

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

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

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

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

1 回复 有任何疑惑可以回复我~
  • 提问者 YogurtJ #1
    嗯嗯好的,感谢老师的深夜回复!
    不过我目前的理解是
    
    幻读 和 幻行并不是 同一个概念
    幻行对应的是不可重复读的问题
    老师课上的例子解决的是幻行
    也就是解决的不可重复读
    而不是幻读的问题
    
    在MySQL的官网上在 
    rr级别下提到的也是phantom row
    而不是phantom read
    
    请问老师怎么看呢?
    回复 有任何疑惑可以回复我~ 2020-03-06 02:29:07
  • 翔仔 回复 提问者 YogurtJ #2
    我想了一下,太晚没睡,短路了,
    刚刚说的RR无法避免幻读的问题,同学可以举个RR幻读的例子,或者直接演示截图一下,当时主要表达的是GAP锁能够正好防止幻读,而 http://mysql.taobao.org/monthly/2017/06/07/ 这个链接还有同学说的情况是使用快照读的情况,我指的是在当前读,也就是gap lock生效之后,另外的事务没法去插入数据,而不是通过快照读,同学可以一下,不通过快照读是否会出现幻读的情况
    回复 有任何疑惑可以回复我~ 2020-03-06 02:34:57
  • 提问者 YogurtJ 回复 翔仔 #3
    嗯嗯谢谢老师,
    不过我认为在当前读的前提下
    在RC级别也不会出现幻读的问题呢
    当前读是加了锁的增删改查
    所以就算不用next key也不会有幻读的问题呀
    
    这也是我在问题的最初希望老师可以举一个例子的原因
    
    手机码的字,不知道老师有没有理解我想表达的意思
    回复 有任何疑惑可以回复我~ 2020-03-06 02:40:25
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信