【浅学Java】InnoDB存储引擎下MVCC(多版本并发控制 )

1. MVCC是什么

MVCC是面试中比较常见的一个问题,那么什么是MVCC机制,它的作用是什么?

它的英文全称是 Multi-Version Concurrency Control ,也就是“多版本并发控制”的意思。在MySQL InnoDB存储引擎下,RC、RR就是基于MVCC进行事务并发控制。

RC:Read Commited,读已提交
RR:Repeatable Read,可重复读

MVCC的实现方式是:基于“数据版本”对事务并发进行访问。

2. RC、RR查询数据时的结果分析

在这里插入图片描述
对于上面的两个查询语句,RC和RR读取的数据区别:
RC:select1——>“张三”,select2——>“张小三”
RR:select1——>“张三”,select2——>“张三”
那么,这两种隔离级别时怎么实现的呢?见下面。

3. 不同隔离级别的实现方式

3.1 UNDO_LOG版本链

首先,InnoDB会创建一个UNDO_LOG版本链的,来记录某条数据各个的版本:
在这里插入图片描述

TRX_ID:完成数据操作的事务编号
DB_ROLL_PTR:指向上一版本的数据信息

3.2 ReadView

“快照读” 就是最普通的Select查询SQL语句。

“当前读” 指代执行以下查询语句时进行数据读取的方式:

insert,update,delete
select … for updata
select … lock in share mode

ReadView是 “快照读” SQL执行MVCC提取数据的依据,它是一个数据结构,包含4个字段:
在这里插入图片描述

3.3 RC的实现方式

两次次查询时,都会生成一个新的ReadView,来实现读已提交
在这里插入图片描述
然后根据ReadView判断那个版本的数据符合要求
在这里插入图片描述
第二个ReadView同理。

3.4 RR的实现方式

两次查询时,第二个会沿用上一个 ReadView,从而解决不可重复读的问题。
在这里插入图片描述
然后根据ReadView判断那个版本的数据符合要求
在这里插入图片描述
由于在RR中,ReadView是复用的,所以两次读取的数据一样。

3.5 RR隔离级别下,使用MVCC可以避免幻读吗

答案是:能,但不完全能!

连续多次 快照读 ,ReadView会产生复用,没有幻读问题。但是:当两次快照读之间存在当前读,ReadView就会重新生成,导致幻读。

在这里插入图片描述

4. MVCC的特点

  1. 允许多个版本同时存在,并发执行。
  2. 不依赖锁机制,性能更高。
  3. 只在读已提交和可重复读的事务隔离级别下使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值