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,解决了脏读、不可重复读。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

质量研发模型---V模型

质量研发模型&#xff08;V模型&#xff09; V模型强调软件开发的协作和速度&#xff0c;将软件实现和验证有机结合起来&#xff0c;在保证较高的软件质量情况下缩短开发周期。 通过对该模型的水平和垂直的关联和比较分析&#xff0c;理解软件开发和测试的关系&#xff0c;该模…

WebAR开发简介

WebAR 开发使企业能够以独特且高度有趣的方式向客户和员工提供信息。 它提供增强现实 (AR) 内容&#xff0c;人们在智能手机上将其视为视觉叠加。 然而&#xff0c;WebAR 可在手机的普通网络浏览器上运行&#xff0c;无需下载任何应用程序。 WebAR 的多种用途包括帮助零售和在…

AI大模型学习:引领智能时代的新篇章

AI大模型学习 随着人工智能技术的不断发展&#xff0c;大模型学习已经成为当前人工智能领域的热门话题。这项技术正在改变着我们对AI的认识和应用&#xff0c;同时也为未来的智能时代开启了新的篇章。 ### 什么是AI大模型学习&#xff1f; AI大模型学习指的是利用大规模数据…

可视化图表:柱状图,最直观的比较数据的方式。

可视化图表是一种将数据通过图形化的方式展示出来的工具&#xff0c;它可以帮助我们更直观地理解数据的分布、趋势和关系。其中&#xff0c;柱状图是最常见和常用的一种图表类型&#xff0c;它通过长方形的柱子来表示数据的大小。本文将介绍柱状图的定义和作用、数学原理、样式…

fl studio21.2中文版下载及使用基础教学

FL Studio 21.2.2是一款功能强大的音乐制作软件&#xff0c;也被广大用户称为“水果编曲”。这款软件支持简体中文和英语&#xff0c;适用于Windows 10/11&#xff08;仅限64位&#xff09;以及MacOS 10.13.6或更高版本的系统。 在FL Studio 21.2.2中&#xff0c;用户可以享受…

软考高级:软件构件与中间件技术概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

代码随想录训练营第58天 | LeetCode 739. 每日温度、​​​​​​LeetCode 496.下一个更大元素 I

目录 LeetCode 739. 每日温度 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;单调栈&#xff0c;你该了解的&#xff0c;这里都讲了&#xff01;LeetCode:739.每日温度_哔哩哔哩_bilibili 思路 ​​​​​​LeetCode 496.下一个更大元素 I 文…

深入理解TCP/IP协议:网络通信的基石

提示&#xff1a;本系列文章重点学习TCP/IP协议 深入理解TCP/IP协议&#xff1a;网络通信的基石 简介一、TCP/IP协议的基本原理二、TCP/IP协议的工作机制三、TCP面向连接建立连接&#xff1a;断开连接&#xff1a; 四、分层传输五、TCP流量控制滑动窗口机制流量控制的工作流程优…

011、获取Revit设计选项

今天来一段简单的代码&#xff0c;获取Revit设计选项&#xff0c;来说说Dynamo一个比较常用的方法&#xff1a; FilteredElementCollector Methods 这个方法的很有用&#xff0c;很多图元的获取都要通过这种方式。 我们打开API手册&#xff0c;直接搜索FilteredElementCol…

暴力破解笔记

1 暴力破解简介 暴力破解&#xff1a; 蛮力攻击&#xff0c;又称为穷举攻击&#xff0c;或暴力破解&#xff0c;将密码进行逐个尝试验证&#xff0c;直到尝试出真正的密码为止。 暴力破解是指采用反复试错的方法并希望最终猜对&#xff0c;以尝试破解密码或用户名或找到隐藏的…

yolov5+pyside6+登录+用户管理目标检测可视化源码

一、软件简介 这是基于yolov5目标检测实现的源码&#xff0c;提供了用户登录功能界面&#xff1b; 用户需要输入正确的用户名和密码才可以登录。如果是超级管理员&#xff0c;可以修改普通用户的信息&#xff0c;并且在检测界面的右上角显示【管理用户】按钮。 支持图片、视频、…

如何挑选品质较高的狗粮?

亲爱的狗友们&#xff0c;我们都知道&#xff0c;给狗狗选择一款高品质的狗粮是非常重要的。那么&#xff0c;如何在这琳琅满目的狗粮市场中挑选出最适合我们狗狗的优质狗粮呢&#xff1f;别担心&#xff0c;让我来给你支支招。 &#x1f43e; **1️⃣ 了解狗狗的营养需求** 首…

【JavaEE初阶系列】——多线程案例三——定时器

目录 &#x1f6a9;定时器是什么 &#x1f6a9;标准库中的定时器 &#x1f6a9;自定义定时器 &#x1f388;构造Task类 &#x1f4dd;相对时间和绝对时间 &#x1f388;构造MyTime类 &#x1f4dd;队列空和队列不为空 &#x1f4dd;wait(带参)解决消耗资源问题 &#…

【面试经典150 | 动态规划】零钱兑换

文章目录 Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 Tag 【动态规划】【数组】 题目来源 322. 零钱兑换 解题思路 方法一&#xff1a;动态规划 定义状态 dp[i] 表示凑成总金额的最少硬币个数。 状态转移 从小到大枚举要凑成的金额 i&#xff0c;如果当前…

204基于matlab的图像融合

基于matlab的图像融合&#xff0c;包括三种方式&#xff0c;加权、PCA、IHS变换。比较三者融合后的图像差异。程序已调通&#xff0c;可直接运行。 204 matlab 图像融合 信息融合 - 小红书 (xiaohongshu.com)

便携式一体化气象站设备

TH-PQX7便携式一体化气象站设备是一种集多种气象监测仪器于一体的高科技装备&#xff0c;能够实现对温度、湿度、风速、风向、气压、降水量等关键气象要素的实时监测。该设备采用先进的传感器技术和数据处理技术&#xff0c;具有高精度、高可靠性、低功耗等特点&#xff0c;可广…

kubernetes-networkpolicies网络策略问题

kubernetes-networkpolicies网络策略问题 问题描述 重点重点重点&#xff0c;查看我的博客CKA考题&#xff0c;里面能找到解决方法 1.部署prometheus监控的时候&#xff0c;都部署成功&#xff0c;但是web访问503-504超时 2.添加ingress的时候也是访问不到&#xff0c;其他命…

matlab编译成jar包

1、输入deploytool命令 2、选择Library Compiler 3、配置打包 4、有效文件 5、java函数调用 package com.beescloud.frame.matlab;import com.mathworks.toolbox.javabuilder.MWException; import test.Class1;public class MatlabTest {public static void main(String[] arg…

我的创作纪念日 ---- 2024/3/26

前言 2024.3.26是我在CSDN成为创作者的第128天&#xff0c;也是我第一次真正在网上创作的第128天 当我还在日常创作时&#xff0c;突然发现我收到了一封信 我想我可以分享一下这段时间的感想以及收获 机缘 在CSDN的这段时间里&#xff0c;我学习到了很多知识&#xff0c;也…

Linux之时间子系统(四): tick 层模块(broadcast )

一、前言 在内核中&#xff0c;有cpuidle framework可以控制cpu的节电&#xff1a;当没有进程调度到该cpu上执行的时候&#xff0c;swapper进程粉墨登场&#xff0c;将该cpu会被推入到idle状态。当然CPU的idle状态有深有浅&#xff0c;当CPU睡的比较深入的时候&#xff0c;有可…