mvcc版本原理 事务版本管理链

2024-01-10 04:35:03

mvcc(Multi-Version Concurrency Control)多版本并发控制,指的就是在READ COMMITTD ,REPEATABLE READ 两种事务隔离级别下的事务在执行普通的SElECT 操作时的访问记录的版本链的过程,

前言:两种不通的区别就是 READVIEW 的时间不同, READ COMMITTD在每一次进行普通SELECT操作前都会生成一个READVIEW,而REPEATABLE READ只在第一次进行普通SELECT操作前生成一个ReadView,之后的查询操作都重复使用这个ReadView,

mysql情况下的几种的事务模式
1.READ UNCOMMITTED:未提交读(可能出现脏读,不可重复读,幻读)
2.READ COMMITTED:已提交读(可能会出现不可重复读,幻读)
3.REPEATABLE:可重复读(可能出现幻读)
4.SERIALIZABLE:可串行化(上面出现都不会出现)

脏读:读取到一条数据过程中(事务还没有结束),另外一条事务在中间修改还没有提交读取的值,
不可重复读:在一个事务中联系两次读取一条数据,每次另外一条事务都是每次都是提交,每次都是读取到不同的值,
幻读:在一个事务中A中,读取一个范围中的值,然后有另外一个事务在这个范围内来插入的一个值,然后读取一个范围内的值不一样,(插入才会,删除会有一个delete mark的操作,不会产生幻读)

这是MySQL4种隔离级别中,我们在mvcc原理是指在 READ COMMITTED 模式下和REPEATABLE模式下产生读和写的一个模式,我们如何通过事务版本管理链来控制读和写来避免脏读和不可重复读。我们来我们每次修改或者插入一个值的时候都会产生一个undo日志,每一个undo日志会会分配一个全局事务id(递增)和一个roll_pointer属性,这个roll_pointer 相当于一个指针,上一条事务会和下一条事务会产生一个通过roll_pointer指向下一个 。

在这里插入图片描述
修改发生数据的过程读取主键为2的最新的流程图

1.READ COMMITTED和REPEATABLE每开启一个事务都会产生一个ReadView,在READ COMMITTED我们读到上图中的事务id80中,这个我们在READ COMMITTED中我们会我们读取一个值事务id80,我们在读取一个数的我们都采用一个不可见原则,那么我们读取的值就是最新的小王80,(事务已经提交)小李的事务id是70,
2.在REPEATABLE模式下我们也会产生一个ReadView下,但是我们在还没有读取到数据的时候,就会产生,然后就会用复用之前的数据产生一个ReadView,假如我们我们第一次读取到是70,然后修改成为小王的事务还没有提交,然后提交,这个时候会复用ReadView然后这个时候读取到的数据就是小李。
所以我们来看MVCC原理就是使用READ COMMITTD ,REPEATABLE READ 下在执行查询操作的版本链的过程,这个样子就是会在对一条数据进行读<–>写 操作并发操作的时候提升性能,两种操作的区别就是生成ReadView时间不同,

文章来源:https://blog.csdn.net/weixin_51260368/article/details/135467832
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。