MySQL多版本并发控制MVCC深入学习

MVCC

MVCC(Multi-Version Concurrency Control),即多版本并发控制。是 innodb 实现事务并发与回滚的重要功能。锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开销.

具体实现是在数据库的每一行中,额外添加三个字段:

  1. DB_TRX_ID : 记录插入或更新该行的最后一个事务的事务ID
  2. DB_ROLL_PTR : 指向改行对应undolog 的指针
  3. DB_ROW_ID : 单调递增的ID,他就是AUTO_INCREMENT的主键ID

快照读

像不加锁的select操作就是快照读,快照读的出现是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即MVCC。可以认为 MVCC 是行锁的一个变种,在很多情况下,避免了加锁操作,降低了开销;既然是基于多版本,即快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本

当前读

读取的是当前的数据,不需要通过undo log回溯到事务开启前的状态。读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。

数据库并发场景有三种,分别为:

  • 读-读:不存在任何问题,也不需要并发控制
  • 读-写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读
  • 写-写:有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失

说白了 MVCC 就是为了实现读-写冲突不加锁,而这个读指的就是快照读, 而非当前读,当前读实际上是一种加锁的操作,是悲观锁的实现

MVCC的出现就是大佬们不满意用悲观锁去解决读-写冲突问题,所以有两个方案:

  • MVCC + 悲观锁
    MVCC解决读写冲突,悲观锁解决写写冲突
  • MVCC + 乐观锁
    MVCC 解决读写冲突,乐观锁解决写写冲突

MVCC实现原理

三个隐藏字段

  • DB_TRX_ID
    6 字节,最近修改(修改/插入)事务 ID:记录创建这条记录/最后一次修改该记录的事务 ID
  • DB_ROLL_PTR
    7 字节,回滚指针,指向这条记录的上一个版本(存储于 rollback segment 里)
  • DB_ROW_ID
    6 字节,隐含的自增 ID(隐藏主键),如果数据表没有主键,InnoDB 会自动以DB_ROW_ID产生一个聚簇索引

版本链 / undo log

因为undo log会记录事务前老版本数据,然后行记录中回滚指针会指向老版本位置,如此形成一条版本链。Read View 会一直遍历链表的DB_TRX_ID,直到找到满足特定条件的 DB_TRX_ID。那么这个DB_TRX_ID所在的旧记录就是当前事务能看见的最新”老版本“

Read View

是事务开启时,当前所有活跃事务(还未提交的事务)的一个集合。或者说Read View 就是事务进行快照读操作的时候生产的读视图 (Read View),在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的 ID

三个Read View重要结构:

  • trx_list(名称我随意取的)
    一个数值列表
    用于维护 Read View 生成时刻系统 正活跃的事务 ID 列表
  • up_limit_id
    是 trx_list 列表中事务 ID 最小的 ID
  • low_limit_id

ReadView 生成时刻系统尚未分配的下一个事务 ID ,也就是 目前已出现过的事务 ID 的最大值 + 1

为什么是 low_limit ? 因为它也是系统此刻可分配的事务 ID 的最小值

MVCC实现的整体流程:

总结

  • 应对高并发事务, MVCC比单纯的加锁更高效
  • MVCC只在 读已提交 和 可重复读 两个隔离级别下工作
  • 读已提交隔离级别下,会在每次快照读(查询)都生成一个Read View,可重复读只在事务开始时生成一个Read View,以后每次查询都用这个Read View,以此实现不同隔离级别。

参考:

【MySQL笔记】正确的理解MySQL的MVCC及实现原理_(推荐)

MySQL · 引擎特性 · InnoDB 事务系统 (taobao.org)

mvcc详解 - 简书 (jianshu.com)

到此这篇关于MySQL多版本并发控制MVCC深入学习的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • mysql多版本并发控制MVCC的实现

    事务隔离级别设置 set global transaction isolation level read committed; //全局的 set session transaction isolation level read committed; //当前会话 修改事务提交方式(是否自动提交,mysql默认自动提交) SET AUTOCOMMIT = 1; //自动提交,为0手动提交 不同数据库引擎MVCC模式各不相同,典型有乐观和悲观并发控制. innodb 说明: InnoDB的MVCC

  • 详解MySQL多版本并发控制机制(MVCC)源码

    目录 一.前言 二.MVCC(多版本并发控制机制) 2.1.Repeatable Read 2.2.Read Commit 2.3.MVCC的优势 三.MVCC(实现机制) 3.1.select运行栈 3.2.read_view的创建过程 3.3.行版本可见性 3.4.undolog搜索可见版本的过程 3.5.read_view创建时机再讨论 四.MVCC和锁的同时作用导致的一些现象 五.总结 一.前言 作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾.<<

  • mysql的MVCC多版本并发控制的实现

    1 什么是MVCC MVCC全称是: Multiversion concurrency control,多版本并发控制,提供并发访问数据库时,对事务内读取的到的内存做处理,用来避免写操作堵塞读操作的并发问题. 举个例子,程序员A正在读数据库中某些内容,而程序员B正在给这些内容做修改(假设是在一个事务内修改,大概持续10s左右),A在这10s内 则可能看到一个不一致的数据,在B没有提交前,如何让A能够一直读到的数据都是一致的呢? 有几种处理方法,第一种: 基于锁的并发控制,程序员B开始修改数据时,

  • Mysql MVCC机制原理详解

    什么是MVCC MVCC,全称Multi-Version Concurrency Control,即多版本并发控制.MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存. 我们知道,一般情况下我们使用mysql数据库的时候使用的是Innodb存储引擎,Innodb存储引擎是支持事务的,那么当多线程同时执行事务的时候,可能会出现并发问题.这个时候需要一个能够控制并发的方法,MVCC就起到了这个作用. Mysql的锁和事务隔离级别 在理解MVCC机制

  • MySQL多版本并发控制MVCC深入学习

    MVCC MVCC(Multi-Version Concurrency Control),即多版本并发控制.是 innodb 实现事务并发与回滚的重要功能.锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开销. 具体实现是在数据库的每一行中,额外添加三个字段: DB_TRX_ID : 记录插入或更新该行的最后一个事务的事务ID DB_ROLL_PTR : 指向改行对应undolog 的指针 DB_ROW_ID : 单调递增的ID,他就

  • MySQL多版本并发控制MVCC详解

    目录 1.什么是MVCC 2快照读与当前读 2.1 快照读 2.2当前读 3.复习 3.1 再谈隔离级别 3.2 隐藏字段.Undo Log版本链 4.MVCC实现原理之ReadView 4.1什么是ReadView 4.2 设计思路 4.3 ReadView的规则 5.举例说明 5.1 READ COMMITTED 5.2 REPEATABLE READ 5.3 如何解决幻读 6.总结 1.什么是MVCC MVCC (Multiversion Concurrency Control),多版本并

  • MySQL多版本并发控制MVCC底层原理解析

    目录 1 事务并发中遇到的问题 1.1 脏读 1.2 不可重复读 1.3 幻读 2 隔离级别 3 版本链 4 ReadView 4.1 ReadView 定义 4.2 访问控制 4.3 再谈隔离 4.3.1 READ COMMITTED(读已提交) 4.3.2 REPEATABLE READ(可重读) 5 幻读 6 总结 1 事务并发中遇到的问题 1.1 脏读 当一个事务读取到了另外一个事务修改但未提交的数据,被称为脏读. 1.2 不可重复读 当事务内相同的记录被检索两次,且两次得到的结果不同时

  • MySQL的多版本并发控制MVCC的实现

    目录 什么是MVCC MVCC的实现 MVCC 有没有解决幻读? 什么是MVCC MVCC就是多版本并发控制. MySQL的事务型存储引擎通过多版本并发控制(MVCC)来提升并发性能. 可以认为MVCC是行级锁的一个变种,但是它在大多数情况下避免了加锁操作,同时实现非阻塞的读操作,因此开销更低. MVCC是通过保存数据在某个时间点的快照来实现的,核心思想就是保存数据的历史版本,通过对数据行的多个版本管理来实现数据库的并发控制. 这样我们就可以通过比较版本号决定数据是否显示出来,读取数据的时候不需

  • Mysql InnoDB多版本并发控制MVCC详解

    目录 一丶为什么需要事务隔离级别 1.实现事务隔离的方式:串行执行 2.实现事务隔离的方式:可串行执行 二丶并发事务执行的问题:脏写,脏读,不可重复读,幻读 1.脏写 2.脏读 3.不可重复读 4.幻读 三丶隔离级别 1.Read UnCommitted 读未提交 2.Read Committed 读已提交 3.Repeatable Read 可重复读 4.Serializable 可串行化 四丶Mysql设置隔离级别 1.设置全局隔离级别 2.设置会话隔离级别 3.设置下一个事务的隔离级别 4

  • Mysql MVCC多版本并发控制详情

    目录 1.MVCC 2.当前读 3.快照读(提高数据库的并发查询能力) 4.当前读.快照读.MVCC关系 5.MVCC实现原理 6.MVCC核心思想 1.MVCC MVCC,全称Multi-Version Concurrency Control,即多版本并发控制.MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存. MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读写冲突,做到即使有>读写冲突时,也能做

  • MySQL中大对象的多版本并发控制详解

    MySQL 8.0:InnoDB中大对象的MVCC 在本文中,我将解释MySQL InnoDB存储引擎中大对象(LOB)设计的多版本并发控制(MVCC) . MySQL 8.0有一个新功能,允许用户部分更新大型对象,包括JSON文档 . 使用此部分更新功能,当LOB部分更新时,MVCC对LOB的工作方式已发生变化. 对于正常更新(完整更新),MVCC将像以前的版本一样工作. 让我们看一下MVCC在不涉及部分更新时的工作原理,然后考虑对LOB进行部分更新的用例. MVCC 常规更新 我使用术语常规

随机推荐