rr 为什么会出现幻读?

首先要知道mvcc的两个概念,
1. undolog 可以理解为就是一个数据快照,里面包含数据,当前事务ID(相当于版本号)和上一个快照的指针。类似链表。
2. readview 可以理解为事务 读快照, 记录当前事务ID,其他未完成的事务ID。这就是多版本的来历。
    就是每个事务就相当于一个版本,记录自己的版本,同时知道其他未完成事务的版本。

rc是每次读生成一个新的readview, 这样每次读都能获取到最新(规则:指当前版本或比未提交版本小的)的undolog。 这样就实现了读已提交。

而rr实现方式是一个事务下多次读使用同一个readview, 那每次查询就会读到同一条
undolog。可以解决重复读问题,同时 这样还可以解决一部分幻读问题。
但是如果两次快照读(就是指readview)之间发生了当前读(非普通select), 那么就会生成新的
readview. 当然新的readview不代表数据一定发生了变化,比如mysql在一些情况下会在事务中开启间隙锁,临键锁会
阻塞数据修改,那么虽然readview变了,但是根据规则找到的还是同一条undolog。 
所以rr解决了一部分幻读的问题,但 当前读 仍然可能造成幻读。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值