【MVCC多版本并发控制】MVCC 机制的原理及实现,什么是MVCC,多版本并发控制

什么是 MVCC

MVCC (Multiversion Concurrency Control) 中文全程叫多版本并发控制,是现代数据库(包括 MySQL、Oracle、PostgreSQL 等)引擎实现中常用的处理读写冲突的手段,目的在于提高数据库高并发场景下的吞吐性能。

如此一来不同的事务在并发过程中,SELECT 操作可以不加锁而是通过 MVCC 机制读取指定的版本历史记录,并通过一些手段保证保证读取的记录值符合事务所处的隔离级别,从而解决并发场景下的读写冲突。

先来了解一下什么是版本链:
在这里插入图片描述
几次执行的对应事务:
在这里插入图片描述
在这里插入图片描述

什么是ReadView

ReadView阅读视图,是“快照读”sql执行的时MVCC提取数据的依据,快照读就是普通的sql查询语句,当前读是指执行下面语句时的执行方式
在这里插入图片描述

在这里插入图片描述

MVCC如何实现RC和RR

RC,RR基于MVCC(多版本并发控制)进行并发事务控制,MVCC是基于“数据版本”对并发事务进行访问

实现RC(读已提交)

在每次快照读的时候都会产生新的ReadView
在这里插入图片描述
然后根据判断规则进行判断是否可以访问数据:
在这里插入图片描述
我们可以依次来分析一下

姓名事务id等于creator_id?trx_id < min_trx_id?trx_id > max_trx_id?min_trx_id < trx_id < max_trx_id 并且不在m_ids集合
张老三3××××
张小三2××××
张三1×

由此可见,张三可以访问

但是读已提交为什么没有完成可重复读,因为在每次读的时候都会产生新的ReadView,当第一次产生的时候张小三还没有提交,但是第二次查询的时候生成ReadView已经提交,这时候就是:一个事务里面两次查询得到了不同的结果,就违背了可重复读。

实现RR(可重复读)

来看下RR是如何解决不可重复读的。

RC是在每次快照读的时候都会产生新的ReadView,而RR是仅在第一次快照读的时候生成ReadView,后序快照读复用,这样就解决了不可重复读的问题
在这里插入图片描述

但是还没有解决幻读的问题(第一次读之后又新增了数据导致读出来的数据不同)

读的时候又分为当前读快照读
快照读是由mvcc负责的,因为RR不管你读几次,都会是读的同一个Readview,所以每次读取都是相同的数据。
当前读是由Innodb的锁去解决的,间隙锁,第一次查出来的数据给这些数据上间隙锁,锁住读出来的数据,别人也不能插数据了,这样就解决了幻读的问题。
在这里插入图片描述

mysql默认的隔离级别是RR,是默认开启间隙锁的,所以在mysql的innodb引擎中是默认解决这个幻读的问题的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杵意

谢谢金主打赏呀!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值