MySQL之MVCC如何实现可重复读和提交读

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨
👀👀👀 个人博客:小奥的博客
👍👍👍:个人CSDN
⭐️⭐️⭐️:Github传送门
🍹 本人24应届生一枚,技术和水平有限,如果文章中有不正确的内容,欢迎多多指正!
📜 欢迎点赞收藏关注哟! ❤️

文章目录

    • 如何实现可重复读
    • 如何实现提交读
    • 总结

如何实现可重复读

今天来带大家学习一下,MVCC是如何实现可重复读的。

假设事务A和事务B同时堆主键id = 1的记录进行操作,事务A和B的事务id分别为20和30 。

在这里插入图片描述

那么这两个事务就会创建各自的ReadView:

在这里插入图片描述

此时事务A的creator_trx_id = 20,事务B的creator_trx_id = 30。由于仅有两个活跃的事务,所以事务列表中最小的事务是事务A,所以min_trx_id = 20,下一个也就是最大的事务id的max_trx_id值应该为事务B的下一个id,即max_trx_id = 31

事务A去读取主键id为1的数据,找到记录之后就会查看该记录的trx_id,假设事务A查询到该记录的trx_id为10 。

随后和自己的creator_trx_id进行比较:

在这里插入图片描述

发现主键id = 1的记录 trx_id = 10 < A.creator_trx_id = 20,就判断到该记录的事务id不存在于活跃的事务列表中小于自己的事务id,这代表本次记录的值是在自己查询之前提交的,所以可以读取,并且在读取完之后,将该记录的trx_id修改为自己的事务id。

在这里插入图片描述

然后,把age字段的值从28修改为30 。

在这里插入图片描述

另外,被修改的字段还有Undo Log中的另一个隐藏字段:roll_pointer指针。它会去指向被事务A修改的之前的数据版本,也就是fancy的年龄为28的数据的地址,就是为了用来记录,方便下次被查询。

在这里插入图片描述

随后,事务B也对该条数据进行操作,事务B的要求是将fancy的年龄从30直接修改为50 。

此时会再次进行一次trx_id的比较过程,去判断自己的creator_trx_id是否大于这条记录对应的trx_id,如果大于,就去修改这条记录的值,将年龄从30修改为50:

在这里插入图片描述

并且Undo Log版本链也会更新对应的数据。

在这里插入图片描述

重点来了

如果此时事务A再去读取主键id = 1这条记录,发现这条记录的trx_id已经被修改为了30,再次进行事务id之间的区间比较:发现 A.trx_id = 20 < 主键 id = 1 记录.trx _id = 30 < max_trx_id = 31,并且trx_id = 30 存在于活跃事务集合m_ids中,就代表自己读取到的是和自己同一时间范围内一块启动的另一个未提交的活跃事务所修改的值。

在这里插入图片描述

那么此时事务A是不会去读取这条记录对应的数据的,它会通过Undo Log版本链上的roll_pointer指向的地址去查找上一个旧版本的记录,直到找到第一条trx_id小于等于自己的事务id并且不存在于活跃事务id集合m_ids列表中的记录,代表是别的事务已经提交的最后一条记录然后读取它。

在这里插入图片描述

这样的话,每一个事务去读取或者修改同一个记录时,只能操作已经提交的数据,未提交的数据时不能被读取到的,MySQL就这样实现了可重复读。

其实本质上就是通过Read View的字段判断这行记录是否对自己可见,如果不可见的话再去找Undo Log里面的记录,直到找到对自己可见的数据,然后才能进行操作。

如何实现提交读

提交读能够解决脏读,脏读问题其实本质上就是一个事务读取到了另一个事务没有提交的内容。

下面我们来学习一下MVCC是如何实现提交读的。

假设事务A和事务B同一时刻启动,事务B将同一行的记录,也就是fancy的年龄改成了25,但是事务B并没有提交,此时事务A就会去读取这条记录的trx_id

在这里插入图片描述

在这里插入图片描述

事务A查看到该记录的trx_id居然比事务A的Read View列表中的creator_trx_id值大,并且修改这条记录的事务trx_id存在于自己的m_ids列表里面,那么事务A就可以判断到该记录是被另一条没有提交的事务修改的,所以它不会去读取这条数据的内容,事务A会通过Undo Log版本链继续找第一条trx_id 小于等于自己的事务id并且不在m_ids列表里面的数据。

所以,事务A不会看到事务B正在修改的数据,脏数据也不会产生。

总结

InnoDB 中,MVCC 就是通过 Undo Log + Read View 进行数据读取,Undo Log 保存了历史快照,而 Read View 规则帮我们判断当前版本的数据是否可见。从而不需要通过加锁的方式,就可以实现提交读和可重复读这两种隔离级别。

总的来说,MVCC本质上就是一种数据结构。已提交读和可重复读都是使用了Read View这种策略通过区间判断获取自己能够读取的内容,然后展示。InnoDB通过MVCC,解决了脏读、不可重复读。

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

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

相关文章

教程3_图像的轮廓

目录 目标 1. 特征矩 2、轮廓质心 3. 轮廓面积 4. 轮廓周长 5. 轮廓近似 6. 轮廓凸包 7. 边界矩形 7.1.直角矩形 7.2. 旋转矩形 8. 最小闭合圈 9. 拟合一个椭圆 10. 拟合直线 目标 在本文中&#xff0c;我们将学习 - 如何找到轮廓的不同特征&#xff0c;例如面积&…

力扣 217.存在重复元素

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;num…

Ansible剧本playbooks详解

一、playbook简介 playbook是ansible用于配置&#xff0c;部署和管理托管主机剧本&#xff0c;通过playbook的详细描述&#xff0c;执行其中一系列tasks&#xff0c;playbook字面意思是剧本&#xff0c;现实中由演员按剧本表演&#xff0c;在ansible中由计算机进行安装&#x…

nginx负载均衡模式

轮询 (Round Robin) 用法&#xff1a;这是Nginx默认的负载均衡策略。每个请求会按顺序分配给upstream中的后端服务器&#xff0c;即按照配置的服务器列表顺序依次分配。 upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.c…

【Java】LinkedList vs. ArrayList:Java中的数据结构选择

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

docker日志大小设置(doker logs)

参考文章docker logs日志上限&#xff08;日志容量上限、日志大小上限&#xff09;&#xff08;默认大小、默认日志大小&#xff09;_docker 日志限制-CSDN博客 如果想要更改 Docker daemon 的全局默认设置&#xff0c;可以修改 Docker daemon 的配置文件 /etc/docker/daemon…

zookeeper--Znode类型详解---面试宝典

一、Znode分类 1、persistent_node 持久化节点 是默认类型&#xff0c;该类型节点&#xff0c;并不会随着客户端断开就会自动删除&#xff1b;zookeeper服务重启该节点也不会被删除&#xff0c;只有手动删除的时候才会删除&#xff1b;可以创建子节点&#xff1b; # create …

uniapp开发小程序遇到的问题,持续更新中

一、uniapp引入全局scss 在App.vue中引入uni.scss <style lang"scss">/* #ifndef APP-NVUE */import "uni.scss";/* #endif */ </style>注意&#xff1a;nvue页面的样式在编译时&#xff0c;有很多样式写法被限制了&#xff0c;容易报错。所…

【C++ leetcode】双指针(专题完结)

15. 三数之和 题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的…

驱动器的工艺结构原理及选型参数总结

🏡《总目录》 目录 1,概述2,工作原理2.1,信号转换2.2,电流放大2.3,电压级转换2.4,控制输出3,结构特点3.1,高集成度3.2,多功能性3.3,高性能3.4,省电节能3.5,稳定可靠4,工艺流程<

面试经典150题【101-110】

文章目录 面试经典150题【101-110】9.回文数61.加一172.阶乘后的069.x的平方根50.Pow(x,n)149.直线上最多的点数52.N皇后II120.三角形最小路径和64.最小路径和63.不同路径II 面试经典150题【101-110】 6道偏数学的题和4道二维dp 9.回文数 一开始想转为字符串再判断。后来发现…

信号处理--基于混合CNN和transfomer自注意力的多通道脑电信号的情绪分类的简单应用

目录 关于 工具 数据集 数据集简述 方法实现 数据读取 ​编辑数据预处理 传统机器学习模型(逻辑回归&#xff0c;支持向量机&#xff0c;随机森林) 多层感知机模型 CNNtransfomer模型 代码获取 关于 本实验利用结合了卷积神经网络 (CNN) 和 Transformer 组件的混合…

五-容量管理之容量预案

容量预案(Capacity Plan)是容量管理的一个重要组成部分。 容量预警条件和措施&#xff1a; 类型预警条件措施应用服务器Load95分位值大于CPU核数的2倍 前一天CPU 95分位值大于90% 内存使用率95分位值大于90%增加应用服务器数据库数据库连接超过200扩容DB服务规格/ 优化SQL查询…

windows下powershell与linux下bash美化教程(使用starship)

starship美化教程 Win11 Powershell 安装 在命令行使用下面命令安装 # 安装starship winget install starship将以下内容添加到 Microsoft.PowerShell_profile.ps1&#xff0c;可以在 PowerShell 通过 $PROFILE 变量来查询文件的位置 Invoke-Expression (&starship i…

【HBZ分享】Kafka为什么性能非常高

Kafka性能高的原因 磁盘顺序读写&#xff1a;磁盘顺序读写的性能可以和内存相媲美&#xff0c;顺序读写不需要寻道时间&#xff0c;也不需要大幅旋转磁头找扇区&#xff0c;所以性能极高 零拷贝&#xff1a; 大幅降低了用户态与内核态之间的切换&#xff0c;从而减少了数据来回…

Chrome安装Vue插件vue-devtools

安装Vue.js开发者工具&#xff08;Vue DevTools&#xff09;到Google Chrome浏览器的步骤可能会随着Vue DevTools更新和Chrome政策变化而有所调整。 1.从GitHub获取源代码&#xff1a; 访问Vue DevTools的GitHub仓库&#xff1a;https://github.com/vuejs/vue-devtools 根据仓…

web学习笔记(四十五)Node.js

目录 1. Node.js 1.1 什么是Node.js 1.2 为什么要学node.js 1.3 node.js的使用场景 1.4 Node.js 环境的安装 1.5 如何查看自己安装的node.js的版本 1.6 常用终端命令 2. fs 文件系统模块 2.1引入fs核心模块 2.2 读取指定文件的内容 2.3 向文件写入指定内容 2.4 创…

sql oracle 获取当前日期的最后一天

语法 LAST_DAY 传入一个日期类型的变量&#xff0c;但会给你一个当月的最后一天的变量 LAST_DAY(TO_DATE(year || - || SUBSTR(month, -2) || -01, YYYY-MM-DD)) < ?应用实例 AssetValueSingleQT.spl 一个表中只存储的年和月&#xff0c;需要更具年月筛选小于指定日期&…

yarn按包的时候报错 ../../../package.json: No license field

运行 yarn config list 然后运行 yarn config set strict-ssl false 之后yarn就成功了

基于SpringBoot“网上选课系统”设计和实现(源码定制以及咨询!!)

博主介绍&#xff1a;✌全网粉丝10W,B站项目阿龙、csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、华为云获奖者&#xff0c;“程序员阿龙”✌ 主要内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python&#xff0c;MYSQL、Hodpoo…