MySQL高级第十五篇:MVCC多版本并发控制原理剖析

news2024/11/25 0:23:26

MySQL高级第十五篇:MVCC多版本并发控制原理剖析

  • 一、什么是MVCC?
  • 二、快照读与当前读?
    • 1. 快照读
    • 2. 当前读
  • 三、MVCC实现原理(ReadView)
    • 1. 隐藏字段
    • 2. Read View
    • 3. 思路设计
    • 4. ReadView使用规则
    • 5. MVCC整体操作流程
  • 四、总结

一、什么是MVCC?

  • MVCC(Multiversion Concurrency Control)多版本并发控制。
  • 就是通过数据行的多个版本管理来实现数据库的并发控制。
  • 这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。
  • 换句话说,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。

二、快照读与当前读?

  • MVCC在MySQL lnnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读–写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。
  • 而这个读指的就是快照读,而非当前读。当前读实际上是一种加锁的操作,是悲观锁的实现,而MVCC本质是采用乐观锁思想的一种方式。

1. 快照读

  • 快照读又叫一致性读,读取的是快照数据。
  • 不加锁的简单的SELECT都属于快照读,即不加锁的非阻塞读
  • 之所以出现快照读,是基于提高并发性能的考虑,快照读的实现是基于MVCC,它在很多情况下,避免了加
    锁操作,降低了开销。
  • 既然是基于多版本,那么快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本。
  • 快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读。

2. 当前读

  • 当前读读取的是记录的最新版本,最新数据,读取时还要保证其他并发事务不能修改。
  • 当前记录会对读取的记录进行加锁。加锁的SELECT,或者对数据进行增删改都会进行当前读。

在以前学习隔离级别时,对于SQL标准中,可重复读 解决了脏读,不可重复读的问题,没有解决幻读。但是在MySQL中,因为MVCC,读的时候其实读的是快照,所以也不会出现幻读。

三、MVCC实现原理(ReadView)

MVCC 的实现依赖于:隐藏字段,Undo Log、Read View

1. 隐藏字段

  • 对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列。
    • trx_id:每次一个事务对某条聚簇索引记录进行改动时,都会把该事务的事务id赋值给trx_id隐藏列。
    • roll_pointer:每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏
      列就相当于一个指针,可以通过它来找到该记录修改前的信息。(每次对记录进行改动,都会记录一条undo日志,每条undo日志也都有一个roll_pointer属性,可以将这些undo日志都连起来,串成一个链表,就是版本链)
      在这里插入图片描述
      insert undo 只在事物回滚时起作用,当事物提交后,该类型的undo日志就没有用了,就会被系统回收。

2. Read View

在MVCC机制中,多个事务对同一个行记录进行更新会产生多个历史快照,这些历史快照保存在Undo Log里。如果一个事务想要查询这个行记录,需要读取哪个版本的行记录,就需要用到ReadView了,它帮我们解决了行的可见性问题。

ReadView就是一个事务在使用MVCC机制进行快照读操作时产生的读视图。当事务启动时,会生成数据库系统当前的一个快照,InnoDB为每个事务构造了一个数组,用来记录并维护系统当前活跃事务的ID(“活跃”指的就是,启动了但还没提交)。

3. 思路设计

使用 READ UNCOMMITTED 隔离级别的事务,由于可以读到未提交事务修改过的记录,所以直接读取记录的最新版本就好了。

使用 SERIALIZABLE 隔离级别的事务,InnoDB规定使用加锁的方式来访问记录。

所以,以上两个隔离级别READ UNCOMMITTED、SERIALIZABLE是用不着MVCC的

使用 READ COMMITTED 和 REPEATABLE READ 隔离级别的事务,都必须保证读到已经提交了的事务修改过的记录,他俩就用到了MVCC机制。

假如另一个事务已经修改了记录但是尚未提交,是不能直接读取最新版本的记录的,核心问题就是需要判断
一下版本链中的哪个版本是当前事务可见的,这是ReadView要解决的主要问题。

  • ReadView中主要的参数:
    • creator_trx_id:创建这个ReadView的事物ID
    • trx_ids:创建ReadView时当前系统的活跃的读写事物列表
    • up_limit_id:活跃事物中最小的ID
    • low_limit_id:已提交事物最大的事物ID(1,2,3事物,1、2未提交3已提交,最大事物ID为3+1=4)

4. ReadView使用规则

  • 如果被访问版本的trx_id属性值与ReadView中的creator_trx_id值相同,意味着当前事务在访问它自己修改
    过的记录,所以该版本可以被当前事务访问。
  • 如果被访问版本的trx_id属性值小于ReadView中的up_limit_id值,表明生成该版本的事务在当前事务生成
    ReadView前已经提交,所以该版本可以被当前事务访问。
  • 如果被访问版本的trx_id属性值大于或等于ReadView中的low_limit_id值,表明生成该版本的事务在当前事
    务生成ReadView后才开启,所以该版本不可以被当前事务访问。
  • 如果被访问版本的trx_id属性值在ReadView的up_limit_id和low_limit_id之间,那就需要判断一下trx_id
    属性值是不是在trx_ids列表中。
    • 如果在,说明创建ReadView时生成该版本的事务还是活跃的,该版本不可以被访问。
    • 如果不在,说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问。

5. MVCC整体操作流程

比如现在执行一条查询语句:

  • 1.首先获取事务自己的版本号,也就是事务ID;
  • 2.获取ReadView;
  • 3.查询得到的数据,然后与ReadView
  • 4.中的事务版本号进行比较;
  • 5.如果不符合ReadView规则,就需要从Undo Log中获取历史快照(顺着版本链向下找,如果直到最后一个版本还不可见的话,就意味着这条记录对该事物完全不可见,查询结果就不包含该记录);
  • 6.最后返回符合规则的数据。

隔离级别为读已提交时,一个事物每次select都会重新获取一次ReadView
隔离级别为可重复读时,一个事物只在第一次select时获取一次ReadView

四、总结

  • 本篇介绍了MVCC在READ COMMITTD、REPEATABLE READ这两种隔离级别的事务在执行快照读操作时访问记录的版本链的过程。这样使不同事务的读–写、写–读操作并发执行,从而提升系统性能。
  • 核心点在于ReadView的原理,READ COMMITTD、REPEATABLE READ这两个隔离级别的一个很大不同就是生成ReadView的时机不同:
    • READ COMMITTD在每一次进行普通SELECT操作前都会生成一个ReadView
    • REPEATABLE READ只在第一次进行普通SELECT操作前生成一个ReadView,之后的查询操作都重复使用这个ReadView就好了。
  • 通过MVCC我们可以解决:
    • 1.读写之间阻塞的问题。通过MVCC可以让读写互相不阻塞,即读不阻塞写,写不阻塞读,这样就可以提升事务并发处理能力。
    • 2.降低了死锁的概率。这是因为MVCC采用了乐观锁的方式,读取数据时并不需要加锁,对于写操作,也只锁定必要的行。
    • 3.解决快照读的问题。当我们查询数据库在某个时间点的快照时,只能看到这个时间点之前事务提交更新的结果,而不能看到这个时间点之后事务提交的更新结果。

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

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

相关文章

响应式开发HTML5CSS3实现视频播放器的功能案例

目录 前言 一、本视频播放器需要实现的功能 ​二、代码分布结构 三、部分主要代码 1.index01.html 2.video1.css 3.video1.js 四、images图片资源及视频 五、运行效果 前言 1.本文讲解的响应式开发技术(HTML5CSS3Bootstrap)的HTML5视频播放器等…

随想录Day59--单调栈: 503.下一个更大元素II , 42. 接雨水

看到下一个更大,最先想到的就是单调栈。所以503.下一个更大元素II可以用单调栈的思路进行求解,其实这道题和496.下一个更大元素 I的思路是一样的,不过是多了一个首位相连的环状条件,这时候可以想到,把数组再复制遍历&a…

推荐系统|多目标建模|多目标优化|跨域多目标算法演进

目录 多目标建模总结 推荐系统——多目标优化 网易严选跨域多目标算法演进 背景介绍 多目标建模及优化 1.样本与特征 2. 模型结构迭代 3. 位置偏差与 Debias 4. 多目标 Loss 优化 5. 跨域多目标建模 多目标建模总结 http://t.csdn.cn/H514i 常见的指标有点击率CTR、…

电、气物联网联合管理监测方案

一、概述 水、电、气联合管理就是把同一个用户的用电计量和用水计量、用气计量统一到一个账户(同时具有子账户),用一套软件进行统一管理,当账户余额不足时,可实行停电催费,从而既达到预付费的目的&#xff…

hue源码编译,替换cloudera manage hue,解决hue滚动条bug问题

一.安装依赖 yum install python python-dev python-setuptools python-pip \ libkrb5-dev libxml2-dev libxslt-dev libssl-dev \ libsasl2-dev libsqlite3-dev libldap2-dev \ libffi-dev nodejs npm cmake make gcc g++ 二.拉取源码 wget https://github.com/cloudera/hue/a…

机器学习笔记之K近邻学习算法

机器学习笔记之K近邻学习算法 引言回顾:投票法回顾:明可夫斯基距离 K \mathcal K K近邻算法算法描述 K \mathcal K K值的选择小插曲:懒惰学习与急切学习 KD \text{KD} KD树描述及示例 K \mathcal K K近邻 VS \text{ VS } VS 贝叶斯最优分类器…

汽车基础软件信息安全与AUTOSAR

AUTOSAR 信息安全框架和关键技术分析 随着汽车网联化和智能化,汽车不再孤立,越来越多地融入到互联网中。在这同时,汽车也慢慢成为潜在的网络攻击目标,汽车的网络安全已成为汽车安全的基础,受到越来越多的关注和重视。AUTOSAR 作为目前全球范围普遍认可的汽车嵌入式软件架…

HDFS FileSystem 导致的内存泄露

目录 一、问题描述 二、问题定位和源码分析 一、问题描述 ftp程序读取windows本地文件写入HDFS,5天左右程序 重启一次,怀疑是为OOM挂掉,马上想着就分析 GC日志了。 ### 打印gc日志 /usr/java/jdk1.8.0_162/bin/java \-Xmx1024m -Xms512m …

Net2FTP搭建免费web文件管理器『打造个人网盘』

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 前言 文件传输可以说是互联网最主要的应用之一,特别是智能设备的大面积使用,无论是个人存储文件资料,还是商业文件流转&#xff0c…

老杨说运维 | 数智时代,运维一体化如何落地实践?

在IT运维的发展过程中,随着分布式架构的加速推进,云原生技术加入应用,运维工具相比过去呈现出了更高强度的进化态势,即从多个相对独立的软件向EA形态的一体化系统进化。本次樱花论坛正是基于这一新的变革点,邀请了行业…

(十二)rk3568 NPU 中部署自己训练的模型,(2)模型转换

对于rknn 模型部署,本人使用*.pt -> *.onnx -> *.rknn的方式。 一、首先是pt文件到onnx文件的转换。 onnx文件导出时,需要修改models/yolo.py文件中的后处理部分。 注意:在训练时不要修改yolo.py的这段代码,训练完成后使用export.py进行模型导出转换时一定要进行修…

RHCE第六次作业

目录 一、编写脚本for1.sh,使用for循环创建20账户,账户名前缀由用户从键盘输入,账户初始密码由用户输入,例如: test1、test2、test3、.....、 test10 1.创建脚本for1.sh 2.执行脚本并查看是否创建成功 二、编写脚本for2.sh,使用for循环,通过…

微积分:微分

目录 1.代数推导 2.几何推导 3.总结 1.代数推导 假设我们有一个正方形初始边长为X,这时面积S1x 然后正方形的边长增加△x,此时面积S2(x△x) 变化的面积大小是△s(x△x)- x2x△x(△x&#x…

软件测试外包干了4年,感觉废了..

先说一下自己的情况,大专生,18年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

c++算法——枚举法

枚举概念 枚举法是通过计算机速度快的特点,对问题所有可能性进行枚举,从中找到答案,需要利用循环。 例题 1,简单数字谜 题目描述 在□内填上一个合适的相同的数字,使等式“□365283□8256”成立。 输入格式 无 输出…

5.2 构造数值积分公式的基本方法与有关概念

学习目标: 如果要学习构造数值积分公式的基本方法与有关概念,可以遵循以下步骤: 1.了解数值积分的基本概念和性质:包括积分的定义、积分的性质、数值积分的定义及其误差等。这可以通过课本或相关的学习资料来了解。 2.掌握构造…

ubuntu 安装vmware tool(优先安装最新ubantu,可以不安装vmware tools)

1在虚拟机种站到安装vmware-tools 然后重启虚拟机 2在磁盘中可以看到如下文件,将zip文件移动到桌面解压备用 3关闭虚拟机 找到编辑虚拟机设置 4点击左侧 CD/dvd(SATA) 如果是使用镜像文件,改成使用物理驱动器. 5 打开命令行 cd 桌面 (如…

yara规则--构建yara规则库

零、快速构建yara规则库的方案 Yara官方预置的规则库,链接 https://github.com/Yara-Rules/rules ClamAV的特征码转换为yara规则,利用工具clamav_to_yara.py将clamav的特征码转换为yara规则 从yara-generator爬取别人上传的样本的规则 利用 yarGen工具 …

电容笔和触控笔有什么区别?2023平价好用的电容笔测评

无论是导电的材料,还是工作的原理,还是操作的方式,甚至是价格,电容笔都和一般的触控笔有着明显的区别。电容笔具有更小的笔尖,并且具有更好的耐磨性。而且现在科技进步很快,IPAD的市场也越来越大&#xff0…

【蓝桥杯省赛真题18】python阴影图形面积 青少年组蓝桥杯python编程省赛真题解析

目录 python阴影图形面积 一、题目要求 1、编程实现 2、输入输出