一、概念

MVCC(Multi-Version Concurrency Control)是在mysql的innodb引擎中用来处理我们并发情况下操作数据时遇到的读写冲突问题的一种解决思想。

MVCC的实现方式是通过Undo日志中的版本链和ReadView可读视图来实现的。MVCC就是在多个事务同时存在时,SELECT语句找寻到具体是版本链上的哪个版本,然后在找到的版本上返回其中所记录的数据的过程。

解释版本链和可读视图之前,我们先要知道mysql会在数据表中默认添加三个隐藏列:

DB_ROW_ID:行id,大小为 6 字节,若表没有主键,InnoDB 会自动生成一个隐藏主键,因此会出现这个列;
        DB_TRX_ID:事务ID,当有事务开启时会生成这样一个全局递增的id;
        DB_ROLL_PTR:回滚指针,通过这个指针可以找到该数据的历史版本,也就是所说的版本链。

版本链就是用一个单链表的结构存放每个事务版本对应的行的数据,通过我当前的事务id可以获取对应的数据。

Read View就是事务进行快照读操作的时候生产的可读视图(Read View),用来判断该数据版本是否可被访问,可读视图可以简单的理解成有三个全局属性:

        trx_list:存放当前正活跃的事务ID;
        low_limit_id:记录trx_list中事务ID最小的ID;
        up_limit_id:可读视图生成时当前全局事务ID的最大值(也有一说是目前已出现过的事务ID的最大值+1)。

二、原理及实现流程

明白概念之后,我们一起探究一下MVCC到底是怎样的实现的。

这里呢,要说一下可读视图判断数据版本是否可被访问的方式是怎样的:

首先比较数据版本的事务ID(DB_TRX_ID )是否小于 low_limit_id, 如果小于,则表示此版本数据可被当前事务访问,如果不小于,接着判断事务ID是否大于或者等于up_limit_id,若是,则表示该数据版本实在可读试图生成之后才出现的,不可被访问,如果事务ID介于up_limit_idlow_limit_id之间,则拿着这个事务ID去和可读试图中事务列表里的事务ID作比较,如果一致,说明该数据版本未被提交,不可访问,反之,则可访问。

我们举两个例子来更好地理解MVCC实现原理:

在读已提交的的事务隔离级别(RC)之下,假设事务A的事务ID是2,当事务 A 未提交时,事务 B 进行查询事务A操作的数据时,假设事务 B 的事务 ID 为 3,此时事务B的可读试图的的事务列表中为 [2,3],而数据的最新版本的 trx_id 为 事务A的事务ID,也就是2,根据上述判断规则,此时该版本的事务ID处于 事务列表中,则该版本数据不可被访问,接着继续查询版本链得到该记录的上一个事务ID为1的版本,显然是小于事务列表中的最小值也就是low_limit_id,因此可以被访问;当事务A提交之后,事务B再查询,此时事务列表里是3,拿到最新版本数据的事务ID还是2,小于3,此时可被访问。

在重复读的事务隔离级别(RR)下,在事务A提交前后,事务B的可读视图始终为第一次查询时生成的,也就是事务列表仍然为[2,3],当事务A提交之后,数据版本的事务ID 也就是2,仍处于事务列表中,因此,数据版本不可访问,最后访问的还是事务ID为1的版本。这也就是可重复读前后查询保持数据一直的原因了。

MVCC(多版本并发控制)原理相关推荐

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

    什么是 MVCC MVCC (Multiversion Concurrency Control) 中文全程叫多版本并发控制,是现代数据库(包括 MySQL.Oracle.PostgreSQL 等)引擎 ...

  2. MYSQL专题-MVCC多版本并发控制

    MVCC,全称Multi-Version Concurrency Control,即多版本并发控制.MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内 ...

  3. 【SQL】MVCC 多版本并发控制

    MVCC多版本并发控制 快照读与当前读 隔离级别 隐藏字段,undo log 版本链 隐藏字段trx_id 版本链 read view 举例说明 read committed(读已提交)隔离级别下 r ...

  4. MySQL MVCC多版本并发控制(脏读和不可重复读解决原理)

    文章目录 一.MVCC概念 二.MVCC应用于已提交读隔离级别 1. 解决脏读 2. 无法解决不可重复读 3. 无法解决幻读 三.MVCC应用于可重复读隔离级别 1. 解决脏读 2. 解决不可重复读 ...

  5. 并发控制:(三)MVCC 多版本并发控制

    1.概述: 定义:Multiversion concurrency control, is a concurrency control method commonly used by database ...

  6. MySQL 高级 —— MVCC 多版本并发控制

    引言 MySQL的大多数事务型存储引擎实现的都不是简单的行级锁.基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制--MVCC.包括其他数据库如Oracle等,由于MVCC并没有一个统一的实现 ...

  7. 【MySQL】MVCC多版本并发控制(重点:MVCC实现原理之ReadView)

    [大家好,我是爱干饭的猿,本文重点介绍MySQL的MVCC概念.快照读与当前读.MVCC实现原理之ReadView.隐藏字段.Undo Log版本链. 后续会继续分享MySQL和其他重要知识点总结,如 ...

  8. MySQL第一讲 一遍让你彻底掌握MVCC多版本并发控制机制原理

    Mysql在可重复读隔离级别下,同样的sql查询语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果.这个隔离性就是靠MVCC(Multi-Versio ...

  9. MySQL数据库MVCC多版本并发控制简介

          MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是 ...

  10. fetch first mysql_MySQL多版本并发控制机制(MVCC)源码浅析

    MySQL多版本并发控制机制(MVCC)-源码浅析 前言 作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾.<>诚然讲的非常透彻,但只能提纲挈领,不能让 ...

最新文章

  1. webform里的验证控件
  2. awk 分隔符_awk命令使用实例
  3. C 语言资源大全中文版
  4. Python中的time、datetime、calendar模块(时间模块)
  5. 课堂练习---最低价格买书
  6. kubernetes(三)k8s中通信和Service
  7. RedHat Linux 5.5系统下配置yum包详细过程
  8. 一款回到顶部的 jQuery 插件,支持 Div 中的滚动条回到顶部
  9. iPhone清理喇叭灰尘_手机喇叭用久了灰尘多,与其经常换手机,不如自己动手清理...
  10. 10 Java 常见的加密方式
  11. 笔记本独显和集显linux,笔记本电脑独显不见了的解决方法介绍
  12. 2022年十三届蓝桥杯国赛(C/C++大学B组)个人题解
  13. 小甲鱼零基础入门学习Python(绝对干货,值得学习)
  14. java全栈系列之JavaSE--数组的三种初始化方法及内存分析024
  15. [4G5G专题-33]:物理层-浅谈ZC序列的原理以及在LTE PSS中的应用
  16. 长时间戴耳机选哪一种、目前最好用的骨传导耳机品推荐
  17. App安全架构之前端安全防护
  18. 爬取大众点评黄焖鸡米饭的数据
  19. 报告 | 腾讯知文,从0到1打造下一代智能问答引擎【CCF-GAIR】
  20. 计算机毕业设计springboot基于Springboot的手机电商网站lmo47源码+系统+程序+lw文档+部署

热门文章

  1. sw工程图导出bom_solidworks怎么导出带缩略图的BOM材料明细表?
  2. 汉仪尚巍手书_汉仪尚巍手书字体
  3. [ASP.NET]基于asp.net的客户信息反馈系统
  4. SourceOffSite使用方法
  5. 解决Symantec卸载需要密码问题又一新招
  6. 如何双击连上校园网NCUWLAN?---bat+Python3给出了可行性答案
  7. nanoCAD Pro 10.0.4447.1969 Build 4520中文免费版
  8. yum源配置(网络仓库)
  9. java连接Hbase操作数据库的全过程---搭建hbase数据库
  10. Java设计登录界面