在 MySQL InnoDB存储引擎下,RC、RR 基于 MVCC 进行并发事务控制, MVCC 是基于“数据版本”对并发事务进行访问

用一个例子来解释一下,下面是一张事务执行流程图:



稍微解释一下:

  1. 事务 Aid=1088 的记录的 name 改为 “张三”,并提交
  2. 事务 Bid=1088 的记录的 name 改为 “张小三”,并提交
  3. 事务 Cid=1088 的记录的 name 改为 “张老三”,并提交
  4. 事务 D 只是去查询 id=1088 的记录

首先模拟一下在 RC 隔离级别下:事务D 第一次读取的数据是 “张三”,第二次读取的就是“张小三”

这里应该很好理解,因为在 RC 隔离级别下,事务D 能读到 commit 的数据,所以就导致了“不可重复读”问题

如果使用 RR 隔离级别,事务D 的两次读取都是 “张三”

RR 隔离级别是基于 MVCC 实现的,MVCC 又依赖 UNDO_LOGUNDO_LOG就是回滚日志,它是一个版本链,它记录了上一次版本的数据变化

eg:事务 B 把“张三”改为了“张小三”,在UNDO_LOG 中的体现如下:



注:最原始的数据,也就是最下面这一条,它的 事务ID回滚指针 都是 null

了解了 UNDO_LOG 之后,现在引入一个新的名词:ReadView(快照读)

快照都就是普通的 sql 查询语句:select ....

有了快照读就有当前读,当前读是指:

Insert、Update、Delete、

Select ... for update

Select ... lock in share mode

ReadView 数据结构



图是从 IT老齐 那儿盗的,稍微解释一下:

m_ids 未提交的事务,不允许读

min_trx_id 就是快要执行完的事务 id

max_trx_id 就是下一个新的事务的 id

creator_trx_id 就是创建这个 ReadView 是哪个事务

RC 原理

RC(读已提交):在每一次执行快照读时生成 ReadView,根据上面的例子



读了两次,生成了两个 ReadView,先看第一个 ReadView,因为在这个 ReadView 生成的时候,事务1 已经 commit 了,所以他不在活跃事务集合里面,所以 m_ids 是 2,3,4

最小活跃事务就是 2 没有异议

预分配事务id 就是 4+1 = 5

当前的 ReadView 是事务 4 创建的,所以 creator_trx_id = 4

第二个 ReadView 也是一样的的逻辑

版本链数据访问规则:

RR 原理

可重复读原理很简单,就是复用 ReadView



eg:在第二次查询的时候,生成的 ReadView 是复用前一次的,所以不会造成 不可重复读

RR 能解决幻读吗?

能,但不完全能。

如果是多次快照读,ReadView会产生复用,没有幻读产生

但是当多次快照读中间存在当前读,ReadView会重新生成,导致产生幻读

MVCC(多版本并发控制)详解的更多相关文章

  1. gcc5.2版本安装详解

    gcc5.2版本安装详解 1.下载gcc-5.2安装包 gcc各版本浏览地址:http://ftp.gnu.org/gnu/gcc/gcc-5.2浏览地址:http://ftp.gnu.org/gnu ...

  2. CentOS 最新版的下载地址 + 版本选择详解

    CentOS 最新版的下载地址 + 版本选择详解 发现越来越多的机关单位.事业单位开始使用 Linux 作为主要服务器,毕竟,Linux的稳定性和高效性是众所周知的,所以我也打算把自己这一块技术加强一 ...

  3. [转帖]rename(Perl语言版本) 详解

    rename(Perl语言版本) 详解 2019-03-19 22:51:23 wayne17 阅读数 464更多 分类专栏: Ubuntu之路   版权声明:本文为博主原创文章,遵循CC 4.0 B ...

  4. InnoDB学习(五)之MVCC多版本并发控制

    MVCC多版本并发控制,是一种数据库管理系统并发控制的方法.MVCC多版本并发控制下,数据库中的数据会有多个版本,分别对应不同的事务,从而达到事务之间并发数据的隔离.MVCC最大的优势是读不加锁,读写 ...

  5. mysql的MVCC多版本并发控制机制

    MVCC多版本并发控制机制 全英文名:Multi-Version Concurrency Control MVCC不会通过加锁互斥来保证隔离性,避免频繁的加锁互斥. 而在串行化隔离级别为了保证较高的隔 ...

  6. MVCC多版本并发控制

    MVCC多版本并发控制 爱情小傻蛋关注 82019.09.28 23:23:37字数 4,740阅读 91,421 前提概要 什么是MVCC 什么是当前读和快照读? 当前读,快照读和MVCC的关系 M ...

  7. 【Mysql】深入理解 MVCC 多版本并发控制

    MVCC MVCC(Multi-Version Concurrency Control),即多版本并发控制.是 innodb 实现事务并发与回滚的重要功能.锁机制可以控制并发操作,但是其系统开销较大, ...

  8. MVCC多版本并发控制的理解

    前置知识 当前读与快照读 当前读 什么是当前读:读取的是最新的数据,不会读到老数据. 何时触发:update.insert.delete.select lock in share mode.selec ...

  9. MySQL MVCC(多版本并发控制)

    概述 为了提高并发MySQL加入了多版本并发控制,它把旧版本记录保存在了共享表空间(undolog),当事务提交之后将重做日志写入磁盘(前提innodb_flush_log_at_trx_commit ...

  10. [MySQL] MVCC 多版本并发控制实现的事务

    1.没有一个统一的实现标准,实现了非阻塞的读操作,写操作也只锁定必要的行2.通过保存数据在某个时间点的快照实现的3.典型的有乐观并发控制和悲观并发控制4.innodb的mvcc是每次事务都有递增的版本 ...

随机推荐

  1. ContOS7搭建RAID-0磁盘阵列

    RAID-0条带数据: 优点:2块硬盘同时在写数据,而且各写各的不影响,速度较快:性能提升2倍(理论): 缺点:服务器硬盘特别容易损坏,一点损坏一个,其余不能用:没有容错性:服务器用的不多,都是配合使 ...

  2. c# ref和out 详解

    前言 数据在内存中,存在两种状态,堆和栈中.堆中的数据是可以直接拿到的,一般称引用对象. 这些对象有一个特征,那就是经过函数处理之后,这些数据在主线程中改变了.好奇点好了,为什么栈中的数据就不会改变呢 ...

  3. 大数据ETL开发之图解Kettle工具入门到精通(经典转载)

    大数据ETL开发之图解Kettle工具(入门到精通) 置顶 袁袁袁袁满 文章目录 第0章 ETL简介 第1章 Kettle简介 1.1 Kettle是什么 1.2 Kettle的两种设计 1.3 Ke ...

  4. 力扣162(java&python)-寻找峰值(中等)

    题目: 峰值元素是指其值严格大于左右相邻值的元素. 给你一个整数数组 nums,找到峰值元素并返回其索引.数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可. 你可以假设 nums[ ...

  5. 力扣560(java&python)-和为k的子数组(中等)

    题目: 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 . 示例 1: 输入:nums = [1,1,1], k = 2输出:2示例 2: 输入:n ...

  6. 针对数据库连接池到DRDS连接探活的优化

    简介: 针对数据库连接池到DRDS连接探活的优化 1. 问题背景 近期在给某专有云客户进⾏云产品应⽤性能优化分析时,发现了⼀个有趣的关于DRDS使⽤层⾯的问题,这⾥给⼤家分享⼀下.使⽤过DRDS产品的 ...

  7. Java异步非阻塞编程的几种方式

    简介: Java异步非阻塞编程的几种方式 一. 从一个同步的Http调用说起 一个很简单的业务逻辑,其他后端服务提供了一个接口,我们需要通过接口调用,获取到响应的数据. 逆地理接口:通过经纬度获取这个 ...

  8. Flink Sort-Shuffle 实现简介

    简介:Sort-Shuffle 使 Flink 在应对大规模批数据处理任务时更加游刃有余 本文介绍 Sort-Shuffle 如何帮助 Flink 在应对大规模批数据处理任务时更加游刃有余.主要内容包 ...

  9. [FAQ] web3js, Error: [number-to-bn] while converting number 0.1 to BN.js instance, error: invalid number value

    我们在调用合约方法时,都可以传一些参数的,比如转账金额 value. value 的单位是 wei,这是一个很小的单位,所以一般数值很大. 如果误把 ether 当成 wei 传参,就会报标题中的错误 ...

  10. dotnet core 不自动从 https 到 http 的 302 重定向

    本文记录一个已知问题,或者准确来说是设计如此的行为,在 dotnet core 下,无论是 dotnet core 3.1 还是 dotnet 5 或 dotnet 6 或 dotnet 7 等,如果 ...