请稍等 ...
×

采纳答案成功!

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

RR级别下的幻读问题

翔仔哥,最近在查阅学习笔记的时候,在RR级别下避免幻读这一块有了新的困惑,gap锁是锁的间隙如锁住了id为(6,9],那我在另一个事务中插入了非gap锁范围的id为10的数据是可以插入了,那事务A不就出现了幻读吗?
我的意思就是gap锁,锁住的只是一个小范围,非该范围的数据还是可以插入数据,不就还是会出现幻读吗
我手动实验了一下,发现事务B插入非gap范围之后的数据成功并提交后,在事务A中用快照读select * from tb1查询的数据是没有幻读的,但用当前的就有了
图片描述

正在回答

1回答

翔仔 2019-07-17 23:49:35

同学好,首先咱们来理解下幻读,

幻读指的是,事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。

像同学上面说的通过当前读确实会产生幻读,因为看起来"多"出数据了,但是RR级别下,是可以通过快照读来避免幻读的,这个就是咱们讲数据库知识的时候说过的知识,这里正好加深巩固下,加油:)

1 回复 有任何疑惑可以回复我~
  • 提问者 Joker4411416 #1
    我通过实验是观察到RR级别快照读可以避免幻读,我疑惑的是,您说的快照读是表象,内在是gap锁+行锁,但是gap锁一般锁的是一个区间,在其他区间依然能够插入数据,虽然快照读可以避免,那为什么gap锁是内在呢,它一般不会全表上gap锁啊,我就是理解成表锁>=gap锁>行锁,没有想明白gap锁为什么成为RR级别避免幻读的内在原因,gap锁一般锁区间,表锁不是更加可以避免幻读吗,就是没想通gap锁的特别之处,还请翔仔哥解惑啊,感谢!
    回复 有任何疑惑可以回复我~ 2019-07-18 09:04:31
  • 翔仔 回复 提问者 Joker4411416 #2
    同学好,里面说的内在是指RR是如何实现的哈,不是通过快照读按照版本控制来实现的,而是通过gap锁+行锁来实现的RR,gap+行锁避免不了幻读,而快照读避免了幻读
    回复 有任何疑惑可以回复我~ 2019-07-18 15:33:15
  • 提问者 Joker4411416 回复 翔仔 #3
    哦,这下清楚了
    回复 有任何疑惑可以回复我~ 2019-07-19 08:32:47
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信