关于MVCC你一定要知道的面试知识点!!!

MVCC

MVCC简介

什么是MVCC?

MVCC的意思是多版本控制,目的是为了解决高并发带来数据读取问题。

为什么我们需要MVCC

原来的防止数据出现读取问题的方案是通过数据库锁的方式,这种方式的缺点就是会锁住数据运行通道,对数据的运行速度有很大的阻碍,而MVCC是一种理念无锁模式,可以在高并发的同时保证数据的准确和统一。

脏读,可重复读,幻影读

脏读

假设有两个事务同时进入,并发请求,事务一把值修改成八百,但是修改失败了,事务回滚,此时事务二读取到的数据就是脏读。

简而言之,就是在事务并发执行的时候,如果事务一未结束,修改的数据并未确定值,有可能造成事务二读取到错误的数据。

不可重复读

也是假设有两个事务并发执行,事务一还没执行完,需要读取两次值的时候,此时事务二把值改了,获取的结果不同,值无法重复读取。

幻影读

幻影读是对整张表来说,结果不同,和不可重复读有相似性,但是幻影读特定针对表,而不可重复读特定针对数据行列。

MVCC的原理以及用处

MVCC的原理

首先我们要知道数据库中的数据行并不是只是我们明面上看到的那样,还有三个隐藏列,第一个隐藏列叫DB_TRX_ID,这个是用来定义事务id的,如果我们有一个插入的事务,这个列就会把这个插入的事务id保存进来。

第二列DB_ROLL_PTR则是存储老数据位置的指针,如果新的数据呗更新,新数据的这个列会存储老数据的这个地址做到指引作用。

第三个隐藏列不重要在这里,因为他是在我们没有维护主键id的时候出现的,为我们每个列维护一个唯一的值。

有了这个基础,那么我们来看看MVCC是怎么实现的吧。

我们来看这张图,让我先来介绍一下MVCC的两个重要模块。

ReadView

这个模块的作用就是在高并发事务进来的时候,给每个事务的id进行记录,先获得当前事务id,然后呢获取所有已经提交事务的id,并且按照从小到大排序,最后呢获取一个还没有开始的事务id。

这三个构成了我们ReadView板块,那么他们是如何在MVCC中使用的呢?

我们还需要下面这个模块undolog

undolog

undolog是什么呢,undolog指的是RollPTR这个列中存储的老数据的集合表。

MVCC的运行逻辑

首先我们搞懂我们的目的是什么,我们需要的是事务在读取到时候,不会去读取别的并发线程没有做完的操作,而是读取已经提交的事务!!!这点很重要,理解这点我们再来看。

我们当前读的事务trx_id是20,而提交的事务trx_id是10。

有四个流程我们走一下。

  1. 刚开始,事务10把数据b修改成800,但是没有提交,而且他说不定会回滚,所以事务20决不能去读这个800,不然就是脏读。所以我们会先比较当前trx_id(事务id)和这个值的trx_id(事务id)是否相同。如果不同的话,就走下一步停止读取。我们这里明显一个是10修改的数据,20来读,他所以不行。

  2. 然后执行第二步,判断当前事务trx_id(事务id)是不是小于最小trx_id(事务id)。如果小于,代表事务已经提交完毕,所以可以读取,但这里20明显大于最小值10。所以也不行。

  3. 然后执行第三部,如果当前trx_id(事务id20)大于我们存在ReadView中的未开始trxid的话,代表此时这个事务也属于未开始事务id,直接找上一条历史数据就行了,并且根据上一条历史数据再走一遍流程。我们这里明显20要小于21。

  4. 如果当前trx_id属于最小trx_id和最大trx_id之间,10到21之间的话,代表我们事务是属于未提交事务之中,所以我们要跳过所有未提交事务的数据,如上图所示的那个trx_id属于10到21之间的数据行。

好了,现在流程走完了,我们可以知道在这个案例中,我们的事务id是20,前面三条都走不通,只能走第四条,第四条会直接找到数据上一条trx_id为初始化1的的时候,并且知道这条是已提交数据,因为我们在第二条判断了,trx_id=1小于最小值10;

现在最后一个问题,如果四条都走不通怎么办?其实数据会根据四个条件再走一次,只不过这个数据指针会回到上一条,就是数据行现在是trx_id=1的时候。

MVCC要注意的一些点

MVCC只能解决读已经提交的数据,还有重复读(痔疮键一次ReadView)的问题,但是不能解决幻影读,和读未提交的数据的问题。

这两个问题只能用数据库锁中表锁或者行级锁来解决,因为如果出现幻影读(还记得我们前面知道他和重复读的区别在于是表级别还是行级别吗),只能用表来锁(因为会降低性能不到万不得已别用)。一个个事务执行,读取未提交的数据的时候呢,数据未提交代表着脏读的出现,这种时候我们只能尽量避免,因为他直接修改数据源的。

  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值