MySQL InnoDB的MVCC实现机制

news2024/11/26 10:28:46

MySQL InnoDB的MVCC实现机制

  • 1.MVCC概述
  • 2.MVCC的实现原理
    • 隐式字段
    • undo日志
    • Read View(读视图)
    • RR隔离级别的Read View方案

1.MVCC概述

什么是MVCC?

MVCC,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存

MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读

什么是当前读和快照读?

  • 当前读
    select lock in share mode(共享锁), select for update ; update, insert ,delete(排他锁)这些操作都是一种当前读,就是它读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁
  • 快照读
    像不加锁的select操作就是快照读,即不加锁的非阻塞读,快照读的实现是基于多版本并发控制,即MVCC,可以认为MVCC是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;既然是基于多版本,即快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本

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

总之,MVCC就是因为大牛们,不满意只让数据库采用悲观锁这样性能不佳的形式去解决读-写冲突问题,而提出的解决方案,所以在数据库中,因为有了MVCC,所以我们可以形成两个组合:

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

这种组合的方式就可以最大程度的提高数据库并发性能,并解决读写冲突,和写写冲突导致的问题!


2.MVCC的实现原理

它的实现原理主要是依赖记录中的 4个隐式字段,undo日志 ,Read View 来实现的😪

隐式字段

每行记录除了我们自定义的字段外,还有数据库隐式定义的DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID等字段

  1. DB_ROW_ID 6byte, 隐含的自增ID(隐藏主键),如果数据表没有主键,InnoDB会自动以DB_ROW_ID产生一个聚簇索引
  2. DB_TRX_ID 6byte, 最近修改(修改/插入)事务ID:记录创建这条记录/最后一次修改该记录的事务
  3. IDDB_ROLL_PTR 7byte, 回滚指针,指向这条记录的上一个版本(存储于rollback segment里)
  4. DELETED_BIT 1byte, 记录被更新或删除,并不代表真的删除,而是删除flag变了

在这里插入图片描述

DB_ROW_ID是数据库默认为该行记录生成的唯一隐式主键;DB_TRX_ID是当前操作该记录的事务ID;而DB_ROLL_PTR是一个回滚指针,用于配合undo日志,指向上一个旧版本;delete flag没有展示出来😫

undo日志

InnoDB把这些为了回滚而记录的这些东西称之为undo log。这里需要注意的一点是,由于查询操作(SELECT)并不会修改任何用户记录,所以在查询操作执行时,并不需要记录相应的undo log。undo log主要分为3种:

  • Insert undo log :插入一条记录时,至少要把这条记录的主键值记下来,之后回滚的时候只需要把这个主键值对应的记录删掉就好了。
  • Update undo log:修改一条记录时,至少要把修改这条记录前的旧值都记录下来,这样之后回滚时再把这条记录更新为旧值就好了。
  • Delete undo log:删除一条记录时,至少要把这条记录中的内容都记下来,这样之后回滚时再把由这些内容组成的记录插入到表中就好了。

删除操作都只是设置一下老记录的DELETED_BIT,并不真正将过时的记录删除🥱

对MVCC有帮助的实质是update undo log ,undo log实际上就是存在rollback segment中旧记录链,它的执行流程如下:

  1. 比如一个有个事务插入persion表插入了一条新记录,记录如下,name为Jerry, age为24岁,隐式主键是1,事务ID和回滚指针,我们假设为NULL
    在这里插入图片描述
    在这里插入图片描述
  2. 现在来了一个事务1对该记录的name做出了修改,改为Tom
  • 在事务1修改该行(记录)数据时,数据库会先对该行加排他锁
  • 然后把该行数据拷贝到undo log中,作为旧记录,即在undo log中有当前行的拷贝副本
  • 拷贝完毕后,修改该行name为Tom,并且修改隐藏字段的事务ID为当前事务1的ID, 我们默认从1开始,之后递增,回滚指针指向拷贝到undo log的副本记录,即表示我的上一个版本就是它
  • 事务提交后,释放锁
    在这里插入图片描述
  1. 又来了个事务2修改person表的同一个记录,将age修改为30岁
  • 在事务2修改该行数据时,数据库也先为该行加锁
  • 然后把该行数据拷贝到undo log中,作为旧记录,发现该行记录已经有undo log了,那么最新的旧数据作为链表的表头,插在该行记录的undo log最前面
  • 修改该行age为30岁,并且修改隐藏字段的事务ID为当前事务2的ID, 那就是2,回滚指针指向刚刚拷贝到undo log的副本记录
  • 事务提交,释放锁
    在这里插入图片描述

同事务或者相同事务的对同一记录的修改,会导致该记录的undo log成为一条记录版本线性表,即链表,undo log的链首就是最新的旧记录,链尾就是最早的旧记录

Read View(读视图)

Read View主要是用来做可见性判断的, 即当我们某个事务执行快照读的时候,对该记录创建一个Read View读视图,把它比作条件用来判断当前事务能够看到哪个版本的数据,即可能是当前最新的数据,也有可能是该行记录的undo log里面的某个版本的数据。

Read View遵循一个可见性算法,主要是将要被修改的数据的最新记录中的DB_TRX_ID(即当前事务ID)取出来,与系统当前其他活跃事务的ID去对比(由Read View维护),如果DB_TRX_ID跟Read View的属性做了某些比较,不符合可见性,那就通过DB_ROLL_PTR回滚指针去取出Undo Log中的DB_TRX_ID再比较,即遍历链表的DB_TRX_ID(从链首到链尾,即从最近的一次修改查起),直到找到满足特定条件的DB_TRX_ID, 那么这个DB_TRX_ID所在的旧记录就是当前事务能看见的最新老版本

上述语言可能难以理解,我们来看下面几张图来辅助一下理解:

首先,Read View维护的视图到底是怎样的?(这里以RC隔离级别举例)

在这里插入图片描述

首先,

  • m_ids为当前系统正在活跃的事务列表(即事务没有被提交)
  • min_trx_id为活跃事务列表的最小值(即开启时间最靠前的一个事务)
  • max_trx_id为活跃事务列表的最大值(即开启时间最靠后的一个事务)
  • create_trx_id为当前快照读所在的事务

那么这个判断条件是什么呢?

很简单

在这里插入图片描述

RR隔离级别的Read View方案

RR隔离级别解决可重复读的问题,本质上是通过对Read View视图的复用来实现的😴

在这里插入图片描述

也就是说,对于在一个事务中不同的快照读,共享一个最早的Read View视图,以保证数据的一致性!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167282.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOV8——快速训练指南(上手教程、自定义数据训练)

概述 本篇主要用于说明如何使用自己的训练数据,快速在YOLOV8 框架上进行训练。当前(20230116)官方文档和网上的资源主要都是在开源的数据集上进行测试,对于算法“小白”或者“老鸟”如何快速应用到自己的项目中,这…

操作系统IO控制方式

操作系统I&O控制方式 视频地址:https://www.bilibili.com/video/BV1YE411D7nH?p64 I&O设备按照信息交换的单位可以分为以下两类: 块设备 数据传输的基本单位是块,传输速率较高,可寻址,可随机读写任意一块。…

78.循环神经网络(RNN)

1. 潜变量自回归模型 2. 循环神经网络 计算损失是比较ot和xt之间来计算损失,但是xt是用来更新ht,使得其挪到下一个单元。 用一个额外的whh来存时序信息。 3. 使用循环神经网络的语言模型 4. 困惑度(perplexity) 5. 梯度剪裁 g表…

《Stealth秘密行动》游戏开发记录

游戏开发的学习记录项目:Stealth秘密行动开始时间:2022.12.30一、新学到的:二、遇到的问题:三、成品部分展示:游戏开发的学习记录⑧ 项目:Stealth秘密行动 开始时间:2022.12.30 (…

数据分析-深度学习Pytorch Day6

卷积神经网络如何运用到图片分类问题感受野 Receptive Field步长Stride填充Padding参数共享share parameter最大池化MaxPoolingCNN全过程仅个人理解学习引言CNN卷积神经网络最初主要是用于计算机视觉和图像处理中,比如图像分类:最终的分类数绝对维度&…

【代码随想录】哈希表-golang

哈希表 from 代码随想录 hash表解法可以是slice,map…,目的是将时间复杂度降为O(1) 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 排序 思路:直接重新声明字符的字节形式,然后对其进行…

Vue的依赖收集和性能问题

什么是依赖收集Vue能够实现当一个数据变更时,视图就进行刷新,而且用到这个数据的其他地方也会同步变更;而且,这个数据必须是在有被依赖的情况下,视图和其他用到数据的地方才会变更。 所以,Vue要能够知道一个…

逻辑思维训练1200题-蓝桥杯计算思维参考

黑格尔曾说过,逻辑是一切思考的基础。逻辑思维能力强的人能迅速、准确地把握住问题的实质,面对纷繁复杂的事情能更容易找到解决的办法。《逻辑思维训练1200 题》介绍了排除法、递推法、倒推法、作图法、假设法、计算法、分析法、类比法、推理法、判断法、…

自动化 | 这些常用测试平台,你们公司在用的是哪些呢?

本文节选自霍格沃兹测试学院内部教材测试管理平台是贯穿测试整个生命周期的工具集合,它主要解决的是测试过程中团队协作的问题。在整个测试过程中,需要对测试用例、Bug、代码、持续集成等等进行管理。下面分别从这四个方面介绍现在比较流行的管理平台。6…

四、template模板

模板 之前的案例中&#xff0c;能够返回简单的字符串信息给浏览器。那如果想要返回html页面给浏览器该怎么做呢&#xff1f; 当然&#xff0c;我们可以这么写&#xff1a; def index(request):return HttpResponse(<h1 style"color:red">我是硬编码的</h…

23年3月如何准备pmp考试?

首先要把PMP考试如何报名、考试内容等都要了解清楚&#xff0c;再去备考。<<PMP入门知识>>PMP考试时长&#xff1a;230分钟。PMP考试形式&#xff1a;笔试。PMP考试题型&#xff1a;题型包括单选题和多选题&#xff0c;多选题将说明需选择几个正确选项。PMP考试题量…

NEUQ week11题解

P1796 汤姆斯的天堂梦 汤姆斯的天堂梦 题目描述 汤姆斯生活在一个等级为 000 的星球上。那里的环境极其恶劣&#xff0c;每天 121212 小时的工作和成堆的垃圾让人忍无可忍。他向往着等级为 NNN 的星球上天堂般的生活。 有一些航班将人从低等级的星球送上高一级的星球&#…

【Java寒假打卡】Java基础-网络编程UDP和TCP

【Java寒假打卡】Java基础-网络编程UDP和TCP网络编程的三要素网络编程的常见命令InetAddress类端口协议UDP发送数据UDP接受数据UDP通信程序的练习TCP通信程序-发送数据TCP通信程序-接受数据网络编程的三要素 网络编程的常见命令 ipconfig 查看本机IP地址ping IP地址&#xff1…

【系列03】方法的学习 方法重载 命令行传参 递归 简单计算机 [有目录]

方法的学习 什么是方法 方法是解决一类问题的步骤的有序组合包含于类或者对象之中方法在程序中被创建,在其他地方被引用 就比如输出方法如:System.out.println(); 就是被封装好的方法 方法设计原则:一个方法完成一个功能,利于后期扩展 [原子性] 使用方法: public class D…

vue中使用echarts 动态渲染数据

一、业务场景&#xff1a; 最近在vue中使用echarts时 引入的时候怎么也引不上&#xff0c;后面发现需要绑定在原型上就可以完美解决(也可以直接在需要引入的页面用ES5中的require引入require&#xff08;‘echarts’&#xff09;) 为了避免大家走弯路&#xff0c;下面整合了一下…

FLStudio水果21最新Daw (宿主软件)电音混音编曲制作工具

对许多音乐爱好者来说&#xff0c;从单独欣赏作品过渡到按自己的心情创作作品&#xff0c;是一种奇妙而令人高兴的体验。 音乐的编曲&#xff0c;特别是电子的编曲&#xff0c;Daw (宿主软件)是重要的要素。 编曲软件有很多。 “专业”这个词取决于你是否在行业的某个部分。 就…

MyBatis 详解 (1) -- 环境搭建、查询操作

MyBatis 详解 1 -- 环境搭建、查询操作一、MyBatis 是什么二、为什么学习 MyBatis三、MyBatis 查询3.1 前言3.2 创建数据库和表3.3 添加 MyBatis 框架支持添加 MyBatis 和 MySQL 驱动3.4 配置连接字符串 和 MyBatis3.4.1 配置连接字符串3.4.2 配置 MyBatis 中的 XML 路径3.5 添…

CSS造成阻塞的原理

目录 1.原理解析 A.webkit渲染过程 B.Gecko渲染过程 C.解析原理 接上篇文章CSS会造成阻塞吗&#xff1f; 我们来说一下CSS造成阻塞的原理 1.原理解析 那么为什么会出现上面的现象呢&#xff1f;我们从浏览器的渲染过程来解析下。 不用浏览器使用的内核不同&#xff0c…

leetcode 648. 单词替换【python3哈希集与两种字典树的方法的思考过程整理】

题目 在英语中&#xff0c;我们有一个叫做 词根(root) 的概念&#xff0c;可以词根后面添加其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如&#xff0c;词根an&#xff0c;跟随着单词 other(其他)&#xff0c;可以形成新的单词 another(另一个)。…

UI自动化测试模块与环境管理全面打通,MeterSphere开源持续测试平台v2.6.0发布

2023年1月16日&#xff0c;MeterSphere一站式开源持续测试平台正式发布v2.6.0版本。 在这一版本中&#xff0c;MeterSphere的UI自动化测试模块与环境管理全面打通&#xff0c;更好地满足了用户一个脚本同时跑多个环境的测试需求。在测试跟踪模块中&#xff0c;测试计划关联测试…