MVCC实现原理以及解决脏读、不可重复读、幻读问题

MVCC实现原理以及解决脏读、不可重复读、幻读问题

  • MVCC是什么?有什么作用?
  • MVCC的实现原理
    • 行隐藏的字段
    • undo log日志
    • 版本链
    • Read View
  • MVCC在RC下避免脏读
  • MVCC在RC造成不可重复读、丢失修改
  • MVCC在RR下解决不可重复读问题
  • RR下仍然存在幻读的问题


MVCC是什么?有什么作用?

MVCC即多版本并发控制,每行数据存在多个事务版本,通过对数据多个版本的访问可以使读操作不会阻塞写操作,写操作不会阻塞读操作。我们所使用的mysql,其默认引擎为inndb,就支持MVCC,使用MVCC来提高mysql读写的性能。

MVCC的实现原理

MVCC通过行隐藏的字段、undo log日志以及Read View 来实现。

行隐藏的字段

每一行数据含有三个字段,分别是row_id、trx_id和roll_pointer。
row_id:行ID,当存在主键和非空唯一键时默认为row_id,如果不存在,则每一行数据隐藏了行ID
trx_id:事务id,即数据对应的事务版本号。
roll_pointer:回滚指针,指向undo log日志中的数据

undo log日志

mysql我们直到其存在三大日志,分别时binlog、undo log、redo log。
undo log日志会在事务执行之前记录数据的信息,当事务执行发生错误需要进行回滚时,会通过undo log日志将数据回滚到执行之前的数据。

版本链

当多个事务对数据进行修改时,会通过行隐藏的回滚指针和undo log日志形成一条版本链。版本链从最新数据的回滚指针指向undo log日志中的历史数据版本,然后相连形成一条版本链。
在这里插入图片描述

Read View

我们上面介绍了行隐藏的字段和undo log日志,多个事务可以从版本链中读取想要的数据版本信息,那么每个事务是怎么找到它们想要的版本呢?或者换一种说法它们怎么找到当前事务可见的数据版本呢?
通过Read View实现,当事务执行时进行一次快照读也即普通查询时,会生成一个Read View视图,在版本链中查找数据后,会通过Read View内部的算法来判断是否对当前事务可见,如果不可见,会在版本链中继续遍历。
Read View实现属性:当生成Read View时,会包含以下属性。
m_ids:当前系统活跃(未提交)的事务id集合
min_limit_id:m_ids中最小的事务id,即最小未提交的事务id
max_limit_id:将要生成的事务id,由于事务id递增生成,因此将要生成的事务id对当前事务是不可见的
creator_trx_id:当前事务id
Read View判断可见性算法
对于一个事务trx_id,由Read View内部算法判断是否可见,如下:
1、如果trx_id < min_limit_id,由于事务id是递增的,而事务id小于最小未提交的事务,说明该事务已经提交,对当前事务是可见的。
2、如果trx_id >= max_limit_id,说明该事务版本是在当前事务生成Read View视图之后执行的,对当前事务是不可见的。
3、如果min_limit_id <= trx_id < max_limit_id,进行以下的判断:
@1:如果m_ids中包含trx_id,并且trx_id !=creator_trx_id,说明该事务是当前事务生成Read View视图时未提交的事务,并且不是当前事务,对当前事务是不可见的。
@2:如果m_ids中包含trx_id,并且trx_id ==creator_trx_id,说明该事务是当前事务生成Read View视图时未提交的事务,但是该事务是当前事务,因此是可见的。
@3:如果m_ids中不包含trx_id,说明该事务已经提交,对当前事务是可见的。

MVCC在RC下避免脏读

在这里插入图片描述
当事务101开启后,修改了id=1的数据后会生成一条事务id=101的数据版本
当事务102开始执行时,进行一次快照读,会生成Read View视图,事务101此时还未提交,生成的视图如下:
在这里插入图片描述
此时在版本链中先找到了事务id=101的数据,由于m_ids包含101并且101 != 102,所以事务id为101的数据对当前事务不可见。
再次遍历找到事务id=100的数据,由于100 < 101,所以事务id=100的数据对当前事务是可见的,因此避免了脏读的问题

MVCC在RC造成不可重复读、丢失修改

在这里插入图片描述

对于上图执行的顺序,由于在RC每进行一次快照读都会生成一个Read View。
第一次查询数据时:
生成视图:在这里插入图片描述
由于100 < 101,对当前事务可见,读取了事务id=100的数据。
当进行第二次查询时:
生成视图:
在这里插入图片描述
由于事务102修改数据,生成事务id=102的数据版本。
当遍历事务id=102的数据版本时,由于 101 <= 102 <103并且m_ids中不包含102,因此事务id=102的数据版本对当亲事务可见,读取了事务id=102的数据。
由于事务的多次查询结果不一样,导致了不可重复读的问题。

MVCC在RR下解决不可重复读问题

在RR隔离级别下,每个事务只能生成一个Read View,就可以保证一个事务中进行多次查询时使用的是同一个视图,就保证了查询的数据相同,解决了不可重复读的问题,
同MVCC解决不可重复读问题一样,MVCC解决了幻读的问题,但是并没有完全解决,还存在一些问题。

RR下仍然存在幻读的问题

在这里插入图片描述
如上图,事务102插入了id=10的数据,由于Read View事务101本来是对事务102插入的数据是不可见的,但是由于事务101对插入的数据进行了修改,而当前修改的数据对当前事务是可见的,就导致了事务101读取了新插入的数据,造成了脏读的问题,但是在业务中发生这种情况的概率相当低

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

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

相关文章

【leetcode100】二叉树的中序遍历

1、题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 2、初始思路 2.1 思路 中序遍历的顺序是左→根→右&#xff0c;定义一个函数进行遍历 # Definition for …

租用服务器还是服务器托管:哪种方案更适合您?

随着企业对网络服务质量要求的不断提高&#xff0c;租用服务器和服务器托管是两种常见的选择&#xff0c;各自具备独特的优势和适用场景。这篇文章将从多个维度对这两种方案进行详细分析&#xff0c;帮助大家进行对比选择。 租用服务器的优劣势分析 优点 无需大额初始投入 租用…

Quartus In-System Sources and Probes Editor 的使用说明

文章目录 前言使用说明参考资料 前言 Quartus 提供了 In-System Sources and Probes Editor 调试工具&#xff0c;通过 JTAG 接口使用该工具可以驱动和采样内部节点的逻辑值。即通过 Sources 功能来驱动 FPGA 内部信号&#xff0c;通过 Probes 功能来探测内部节点的逻辑值。在…

2. C语言 基础语法

本章目录: 前言1. C 语言的基础结构1.1 C 程序的基本构成1.2 一个简单的 C 程序实例1.3 复杂的 C 程序结构 2. C 语言的基本构成单元2.1 关键字标准关键字C99 新增关键字C11 新增关键字 2.2 标识符2.3 常量2.4 注释 3. 语句与表达式3.1 语句3.2 表达式 4. 分隔符与空格4.1 分隔…

AURIX的TASKING链接文件语法学习

链接文件中的定义&#xff1a; group (ordered, contiguous, align 4, attributesrw, run_addr 0x70005000)//mem:dsram0){select ".data.user_test_data";select "(.data|.data*)";//select "(.bss|.bss*)"; //select ".bss.…

QT----------QT Data Visualzation

实现思路&#xff1a; 配置项目&#xff1a;在 .pro 文件中添加 QT datavisualization 以引入 QT Data Visualization 模块。创建主窗口&#xff1a;使用 QMainWindow 作为主窗口&#xff0c;添加 Q3DScatter、Q3DBars 和 Q3DSurface 等三维视图组件。初始化和创建三维图表&a…

cursor 配置 deepseek 后,无法使用 cursor 的 Composer问题

我在充值完 cursor 后&#xff0c;就能正常使用 cursor 的 Composer 功能了&#xff0c;我使用的是模型 claud-3.5-sonnet&#xff0c;可是我今天在 cursor 中配置完 deepseek 后&#xff0c;发现 cursor 的 composer 功能无法使用了&#xff0c;即使我把 deepseek 的配置删除后…

IT运维的365天--024 闲置路由器关闭了dhcp,如何知道它的IP是啥

有时候各种原因&#xff0c;我们关闭了路由器的Dhcp&#xff0c;比如需要获取的无线IP和有线同一个网段的情况。时间久了&#xff0c;如果没做标记&#xff0c;大部分时候就会忘了路由器原来设置的是什么IP&#xff0c;没有路由器的对应IP&#xff0c;自然也无法进路由器后台去…

C语言中的printf、sprintf、snprintf、vsnprintf 函数

目录 1.1 概述 1.2 函数原型 1.3 返回值 1.4 示例 1.5 输出结果 1.6 常用格式说明符 1.7 注意事项 2. snprintf 函数 2.1 概述 2.2 函数原型 2.3 返回值 2.4 示例 2.5 输出结果 2.6 使用场景 2.7 注意事项 3. vsnprintf 函数 3.1 概述 3.2 函数原型 3.3 返回…

以余弦序列谈频谱泄漏

廖老师说频谱泄漏是指有新的频率分量生成。一句话get到点上。 对于频谱泄露&#xff0c;信号为无限长序列&#xff0c;运算需要截取其中一部分&#xff08;截断&#xff09;&#xff0c;于是需要加窗函数&#xff0c;加了窗函数相当于时域相乘&#xff0c;于是相当于频域卷积&…

前端项目打包发布

webstorm下的vue项目 打包项目 在package.json中执行打包命令&#xff0c;运行结束后会生成一个 dist目录 发布项目 通过tomcat部署项目 注意&#xff1a;通过tomcat发布前端项目不需要重启tomcat&#xff0c;如果有文件更新需要重启tomcat 在虚拟机上进入tomcat的webapp…

R语言6种将字符转成数字的方法,写在新年来临之际

咱们临床研究中&#xff0c;拿到数据后首先要对数据进行清洗&#xff0c;把数据变成咱们想要的格式&#xff0c;才能进行下一步分析&#xff0c;其中数据中的字符转成数字是个重要的内容&#xff0c;因为字符中常含有特殊符号&#xff0c;不利于分析&#xff0c;转成数字后才能…

浅谈如何学习编程技术

编程&#xff0c;即 编写程序使计算机完成指定的任务。 计算机底层只能识别0和1&#xff0c;但是编程相关的技术栈纷繁复杂&#xff0c;变化多端&#xff0c;无穷无尽。比如 编程语言就分很多种。完成某种特定功能的中间件技术更多。在有限的时间里 如何学习无限的技术&#x…

《一文读懂PyTorch核心模块:开启深度学习之旅》

《一文读懂PyTorch核心模块:开启深度学习之旅》 一、PyTorch 入门:深度学习的得力助手二、核心模块概览:构建深度学习大厦的基石三、torch:基础功能担当(一)张量操作:多维数组的神奇变换(二)自动微分:梯度求解的幕后英雄(三)设备管理:CPU 与 GPU 的高效调度四、to…

华为消费级QLC SSD来了

近日&#xff0c;有关消息显示&#xff0c;华为的消费级SSD产品线&#xff0c;eKitStor Xtreme 200E系列&#xff0c;在韩国一家在线零售商处首次公开销售&#xff0c;引起了业界的广泛关注。 尽管华为已经涉足服务器级别的SSD制造多年&#xff0c;但直到今年6月才正式推出面向…

【生活】冬天如何选口罩(医用口罩,N95, KN95还是KP95?带不带呼吸阀门?带不带活性炭?)

&#x1f4a1;总结一下就是&#xff1a; 日常防护的话&#xff0c;医用口罩就可以啦。要是想长时间佩戴N95&#xff08;KN95&#xff09;口罩的话也可以. 在高风险环境&#xff08;像医院、疫情防控期间&#xff09;&#xff0c;一定要选不带呼吸阀门的N95口罩KN95&#xff09…

Javascript算法——回溯算法(组合问题)

相关资料来自《代码随想录》&#xff0c;版权归原作者所有&#xff0c;只是学习记录 回溯 回溯模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点…

计算机创造的奇迹——C语言

一.简介 C语言是一种较早的程序设计语言&#xff0c;诞生于1972年的贝尔实验室。1972 年&#xff0c;Dennis Ritchie 设计了C语言&#xff0c;它继承了B语言的许多思想&#xff0c;并加入了数据类型的概念及其他特性。 尽管C 语言是与 UNIX 操作系统一起被开发出来的&#xff…

【门铃工作原理】2021-12-25

缘由关于#门铃工作原理#的问题&#xff0c;如何解决&#xff1f;-嵌入式-CSDN问答 4 RST&#xff08;复位&#xff09;当此引脚接高电平时定时器工作&#xff0c;当此引脚接地时芯片复位&#xff0c;输出低电平。 按钮按下给电容器充电并相当与短路了R1改变了频率&#xff0c;按…

2025年,测试技能支棱起来。

你是否曾为提升自己的测试技能而烦恼&#xff1f;在这个日新月异的技术时代&#xff0c;2025年已经悄然而至&#xff0c;软件测试行业的需求和挑战也在不断变化。那么&#xff0c;如何在这个竞争激烈的环境中脱颖而出&#xff0c;成为一名更加优秀的测试工程师呢&#xff1f; …