MVCC是什么
MVCC全称Multi-Version COncurrentcy Control,多版本并发控制。它是一个机制,用于去维护一个数据的多个版本,使得多个事务之间的读写操作没有冲突。
MVCC实现原理
- 数据版本的维护
即通过undo log日志维护的版本链
版本链又是什么?其实就是一个数据的很多次历史版本,用过回滚指针形成链状
还有个事务id,记录是哪个事务修改的 - 读取时的策略
既然不同时候的历史版本数据有了,那么我们该如何去读取呢?
即readView,可以简单理解为对当时数据进行了一次拍照,但其实并不是真正的对当时的记录做了一次复制,只是通过记录了的几个字段,便可以在版本链中找到当时的历史版本。相当于是逻辑上的一个索引
到这里其实已经可以简单理解MVCC了,接下来在通过它的过程深入理解一下
事务读取历史版本的过程
*在readView去读取历史版本的时候,只有一个原则,即当时已经提交的事务和自身修改的(指数据),只有这两个是你可以读到的,仔细想一下是不是很合理?只有当时正在活跃的事务,和后面开启的事务你是不可以读到的的。我们去版本链查找的时候只要比对事务ID排除掉这两者是不是就可以了?
理解这一点,那么读取过程就非常容易理解了,这里不过多赘述,其他博客写的很详细
由此我们便可以读取到readView生成时候的历史数据
和事务隔离级别的关系
而事务隔离级别读已提交和可重复读,其实就是通过生成readView的策略不同,来达到数据读取的不同策略
读已提交:每次快照读都会生成readView。是不是就是每次可以读取到最新提交的事务数据呢?
可重复读:事务开始后第一次快照读生成readView,后续沿用这个快照。所以后面的事务不管怎么提交是不是都没有影响我们?读取的时候永远是历史版本!(当然实际有幻读问题,需要我们去解决),数据完全可控,不会莫名其妙的数据一下变成别人修改的了
如有问题,欢迎指正(>○<)