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

MVCC_多版本并发控制

  • 1. MVCC是什么
  • 2. RC、RR查询数据时的结果分析
  • 3. 不同隔离级别的实现方式
    • 3.1 UNDO_LOG版本链
    • 3.2 ReadView
    • 3.3 RC的实现方式
    • 3.4 RR的实现方式
    • 3.5 RR隔离级别下,使用MVCC可以避免幻读吗
  • 4. MVCC的特点

1. MVCC是什么

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

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

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

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

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

【浅学Java】InnoDB存储引擎下MVCC(多版本并发控制 )_第1张图片
对于上面的两个查询语句,RC和RR读取的数据区别:
RC:select1——>“张三”,select2——>“张小三”
RR:select1——>“张三”,select2——>“张三”
那么,这两种隔离级别时怎么实现的呢?见下面。

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

3.1 UNDO_LOG版本链

首先,InnoDB会创建一个UNDO_LOG版本链的,来记录某条数据各个的版本:
【浅学Java】InnoDB存储引擎下MVCC(多版本并发控制 )_第2张图片

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个字段:
【浅学Java】InnoDB存储引擎下MVCC(多版本并发控制 )_第3张图片

3.3 RC的实现方式

两次次查询时,都会生成一个新的ReadView,来实现读已提交
【浅学Java】InnoDB存储引擎下MVCC(多版本并发控制 )_第4张图片
然后根据ReadView判断那个版本的数据符合要求
【浅学Java】InnoDB存储引擎下MVCC(多版本并发控制 )_第5张图片
第二个ReadView同理。

3.4 RR的实现方式

两次查询时,第二个会沿用上一个 ReadView,从而解决不可重复读的问题。
【浅学Java】InnoDB存储引擎下MVCC(多版本并发控制 )_第6张图片
然后根据ReadView判断那个版本的数据符合要求
【浅学Java】InnoDB存储引擎下MVCC(多版本并发控制 )_第7张图片
由于在RR中,ReadView是复用的,所以两次读取的数据一样。

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

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

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

【浅学Java】InnoDB存储引擎下MVCC(多版本并发控制 )_第8张图片

4. MVCC的特点

  1. 允许多个版本同时存在,并发执行。
  2. 不依赖锁机制,性能更高。
  3. 只在读已提交和可重复读的事务隔离级别下使用。

你可能感兴趣的:(MySQL,java,数据库,面试)