首页 > 其他分享 >MVCC 是什么?InnoDB 是如何实现 MVCC 机制的?

MVCC 是什么?InnoDB 是如何实现 MVCC 机制的?

时间:2023-03-06 17:33:58浏览次数:54  
标签:事务 读取 InnoDB 版本 MVCC 机制 数据 ID

概念

MVCC全称 Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突。

解决问题

MVCC主要解决的问题是可以保证MySQL在读的时候不会阻塞写,在写的时候不会阻塞读(读取数据时通过一种类似快照的方式将数据保存下来,这样读锁就和写锁不冲突了, 不同的事务session会看到自己特定版本的数据);同时还能解决脏读、幻读、不可重复读。

如何实现

MVCC的具体实现,还需要依赖于数据库记录中的三个隐式字段undo log日志readView

三个隐藏字段:

这三个字段分别是:

  • DB_TRX_ID:表示写入该版本数据的事务 ID。

  • DB_ROLL_PTR:表示该数据行被删除或更新前的位置。

  • DB_ROW_ID:表示该数据行的 ID。

写/修改:当一个事务对某个数据行进行修改时,InnoDB 会将该数据行的旧版本存储到回滚日志中,并生成一个新版本,新版本的 DB_TRX_ID 字段存储当前事务的 ID,DB_ROLL_PTR 字段存储回滚日志中旧版本的位置,DB_ROW_ID 字段则为新生成的 ID。

并发读取:在并发读取时,如果某个事务读取了某个数据行的旧版本,但是当前该数据行已经被其他事务修改了,则该事务会通过 DB_TRX_ID 字段判断该版本是否可见,如果不可见则会读取当前可见的版本,如果可见则会继续读取该版本。这种机制可以有效地避免并发读取时的数据冲突。

在 InnoDB 中,为了实现 MVCC,还需要使用 undo log 和 read view 来存储数据。undo log 记录了每个事务对数据行进行修改的情况,read view 记录了每个事务开始时的数据版本号和当前系统时间,用于判断事务是否可以读取某个数据行的版本。当一个事务执行查询操作时,InnoDB 会根据 read view 来确定该事务能够读取到的数据版本号,并使用 undo log 来恢复该数据行的历史版本。

 

流程

  1. 在查询一条数据记录时,先会获取自己的事务ID

  2. 再根据生成的Read View的规则来判断其要访问的数据的版本是否允许被访问(当一个事务需要读取一行记录时,InnoDB 首先读取这行记录的创建时间和过期时间,并根据这些信息判断该行记录是否可见。如果创建时间早于当前事务的开始时间,且过期时间晚于当前事务的开始时间,那么该行记录对当前事务可见。)

  3. 如果不允许,需要使用Undo Log的版本链寻找到以前版本的数据

  4. 最后返回数据

 

注意

MVCC只在 READ COMMITTED 和 REPEATABLE READ 两个隔离级别下工作。其他两个隔离级别够和 MVCC不兼容。已提交读和可重复读的区别就在于它们生成ReadView的策略不同。在读已提交的的事务隔离级别下,每次读取都会生成一个Read View来解决脏读的问题,在可重复度的隔离级别下,一个事务在第一次生成一次Read View,之后的查询都使用这个Read View,解决了不可重复读的问题。

标签:事务,读取,InnoDB,版本,MVCC,机制,数据,ID
From: https://www.cnblogs.com/galo/p/17184694.html

相关文章

  • 多头自注意力机制实现及代码
    注意力机制是一种在给定文本词向量中查找重要词,并赋予一定重要权值的机制。假设输入序列为X,三个随机初始的矩阵键值K(Key)、查询值Q(Query)和值V(Value)。当Query、K......
  • Reflection反射机制原理、使用场景 及 缺陷
    (目录)反射一个需求引出反射需求如下:根据配置文件re.properties中的指定信息,创建Cat对象并调用方法hi在配置文件中代码:classfullpath=com.panyujie.reflection.Cat,m......
  • Kubernetes的工作机制
    云计算时代的操作系统Kubernetes是一个生产级别的容器编排平台和集群管理系统,能够创建、调度容器,监控、管理服务器。Kubernetes的基本架构操作系统的一个重要功能就是......
  • java基础语法-包机制
    包机制定义包(为了更好的组织类,java提供了包机制,用于区别类名的命名空间。)包语法的语法格式packagepkg1[.pkg2[.pkg3···]];一半利用公司域名倒置作为包名......
  • 微信小程序结合php后台实现登录授权机制详解
    微信小程序应用的用户登录授权机制相当复杂,官方给出了下面一张流程图来解释:下面结合这张图来详细讲述下小程序的登录验证授权机制。首先,小程序应用实现登录验证的前提是......
  • 2.JavaScript如何实现异步编程,可以详细描述EventLoop机制
    单线程和异步js的任务分为同步和异步两种,它们的处理方式也不同,同步任务是直接在主线程上排队执行,异步任务则会被放在任务队列中,若有多个任务(异步任务)则要在任务队列中排......
  • 1.为何try里面放return,finally还会执行,理解其内部机制
    涉及到了一种数据类型:Completion,是js七大标准类型之一为何try里面放return,finally还会执行这种行为就是因为CompletionRecord,在js中,每条语句的执行完成状态都是由Comple......
  • MySQL的InnoDB 三种行锁,SQL 语句加了哪些锁?
    InnoDB三种行锁:RecordLock(记录锁):锁住某一行记录GapLock(间隙锁):锁住一段左开右开的区间Next-keyLock(临键锁):锁住一段左开右闭的区间哪些语句上面会加行锁?(1)对于常见的......
  • Java包机制 与Javados 命令
    package:定义包import :导入包com.wang.test.*:点*是导入当前包下的所有类@author :注释作者名@version:注释版本号@since  :说明最早使用的jdk版本;@param ......
  • Spring MVC 配置类 WebMvcConfigurerAdapter
    WebMvcConfigurerAdapter配置类是spring提供的一种配置方式,采用JavaBean的方式替代传统的基于xml的配置来对spring框架进行自定义的配置。因此,在springboot提倡的基于注解......