视频课程
小黑屋思过中,禁止观看!
评论并刷新后可见

您需要在视频最下面评论并刷新后,方可查看完整视频

视频课程
立即观看
付费视频

您支付费用,方可查看完整视频

¥{{user.role.value}}
课程视频
开始学习
会员专享

视频合集

最强MySQL MVCC实现原理,图文视频详解!

  • 课程笔记
  • 问答交流

之前我谈过MySQL事务ACID与隔离级别,如果面试官还想往里深入来面试,一定还会问到MVCC。

为了助大家掌握好MVCC,这节课我会重点讲解以下9点:

1.什么是MVCC?

2.MVCC解决什么问题?

3.MVCC与隔离级别的关系?

4.MVCC涉及的锁机制?

5.谈谈MVCC的实现原理?

6.什么是快照读/一致性读?

7.隐藏字段是做什么?

8.Undo Log版本链解决什么问题?

9.Read View读视图解决什么问题?

等等,这些问题我会在本节课里来重点解决,除此以外我会结合很多案例以及生活中的实际场景,让你彻底理解好MVCC,秒杀面试官!

我会讲解1个小时,搬好小凳子开始吧:)

MVCC(快照读/一致性读)

MVCC全称是: Multiversion concurrency control 多版本并发控制,顾名思义支持MVCC的数据库表中每一行数据都可能存在多个版本,对数据库的任何修改的提交都不会直接覆盖之前的数据,而是产生一个新的版本与老版本共存,通过读写数据时读不同的版本来避免加锁阻塞。

当前不仅仅是MySQL,其它数据库系统(如Oracle,PostgreSQL)也都实现了MVCC。

备注:MVCC并没有一个统一的实现标准,所以不同的数据库,不同的存储引擎的实现都不尽相同。

MVCC解决什么问题

解决了在REPEATABLE READ和READ COMMITTED两个隔离级别下读同一行和写同一行的两个事务的并发。
最强MySQL MVCC实现原理,图文视频详解!-mikechen

  • Read Committed – 一个事务读取数据时总是读这个数据最近一次被commit的版本
  • Repeatable Read – 一个事务读取数据时总是读取当前事务开始之前最后一次被commit的版本(所以底层实现时需要比较当前事务和数据被commit的版本号)。

一句话总结:MVCC是为了解决并发事务处理中的读写冲突问题,做到即使有读写冲突时,也能做到读不加锁,非阻塞并发读

MVCC和隔离级别的关系

 

 

评论交流
  1. 路正银

    1:MVCC解决什么问题?
    MVCC是为了解决并发事务处理中的读写冲突问题,做到即使有读写冲突时,也能做到读不加锁,非阻塞并发读。

    2:谈谈Innodb MVCC的底层实现?
    每个表中添加两个隐藏字段:DATE_TRX_ID:最近修改(修改、插入)事务ID;DATE_ROLL_PTR:回滚指针,指向这条记录的上个版本。
    Undo log版本链:行版本控制(MVCC)
    Read View(读视图):记录当前系统中活跃的事务id
    结合读视图判断数据版本在当前事务中是否可见,如果不可见就继续从版本链中通过回滚指针拿取上个版本继续进行判断,直到找到符合当前事务版本的数据行。

    3:最后谈谈MVCC与事务隔离级别的关系?
    MVCC只在REPEATABLE READ和READ COMMINTTED两个隔离级别下工作。
    其他两个隔离级别都和MVCC不兼容,因为READ UNCOMMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行,而SERIALIZABLE会对所有读取到的行都加锁。

    • mikechen

      ?非常棒,核心点都理解到位了,面试就没有什么问题了

  2. 李鸿翼

    1:MVCC解决什么问题?
    解决多事务并发同时读写问题

    2:谈谈Innodb MVCC的底层实现?
    (1)两个隐藏字段:事务txr_id字段和undo log 回滚指针字段
    (2)由undo log组成的undo log 回滚链
    (3)readview快照,包含活跃的事务txr_id
    每次读的时候,根据readview+undo log链找最近一次commit提交数据

    3:最后谈谈MVCC与事务隔离级别的关系?
    主要是为rr 和rc服务的
    rr : 事务第一次查询的时候,开启快照读,后续查询都是同一个快照读
    rc: 事务内每次查询,都开启一个快照读