如何理解MVCC?大白话通俗易懂,不深奥

MVCC是什么

MVCC全称Multi-Version COncurrentcy Control,多版本并发控制。它是一个机制,用于去维护一个数据的多个版本,使得多个事务之间的读写操作没有冲突。

MVCC实现原理

  1. 数据版本的维护
    即通过undo log日志维护的版本链
    版本链又是什么?其实就是一个数据的很多次历史版本,用过回滚指针形成链状
    在这里插入图片描述
    还有个事务id,记录是哪个事务修改的
  2. 读取时的策略
    既然不同时候的历史版本数据有了,那么我们该如何去读取呢?
    即readView,可以简单理解为对当时数据进行了一次拍照,但其实并不是真正的对当时的记录做了一次复制,只是通过记录了的几个字段,便可以在版本链中找到当时的历史版本。相当于是逻辑上的一个索引
    在这里插入图片描述

到这里其实已经可以简单理解MVCC了,接下来在通过它的过程深入理解一下

事务读取历史版本的过程

*在readView去读取历史版本的时候,只有一个原则,即当时已经提交的事务和自身修改的(指数据),只有这两个是你可以读到的,仔细想一下是不是很合理?只有当时正在活跃的事务,和后面开启的事务你是不可以读到的的。我们去版本链查找的时候只要比对事务ID排除掉这两者是不是就可以了?

理解这一点,那么读取过程就非常容易理解了,这里不过多赘述,其他博客写的很详细

由此我们便可以读取到readView生成时候的历史数据

和事务隔离级别的关系

而事务隔离级别读已提交和可重复读,其实就是通过生成readView的策略不同,来达到数据读取的不同策略

读已提交:每次快照读都会生成readView。是不是就是每次可以读取到最新提交的事务数据呢?
可重复读:事务开始后第一次快照读生成readView,后续沿用这个快照。所以后面的事务不管怎么提交是不是都没有影响我们?读取的时候永远是历史版本!(当然实际有幻读问题,需要我们去解决),数据完全可控,不会莫名其妙的数据一下变成别人修改的了

如有问题,欢迎指正(>○<)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值