MYSQL MVCC多版本并发控制机制与原理、可重复读/读已提交原理

news2024/12/24 16:42:51

1,前置知识回顾

        1.1,当前读和快照读

        根据前面章节可知,mysql在【可重复读】(RR)的事务隔离机制下,同一个事务中的多次读取结果是一样的。而【读已提交】(RC)事务隔离机制,每次读取都会读取到已提交事务的最新数据。【读未提交】(RU)事务隔离机制,可以直接读取到未提交事务的数据。

        工作中常用的两种隔离机制【RR】(mysql默认)是如何保证同一事务中每次读取结果都一样呢?【RC】又是如何做到读取已提交事务的数据的呢?一切都源于MVCC(Multi-Version Concurrent Control多版本并发控制)的数据可见性原则实现。本章将通过实际案例讲解MVCC数据的可见性机制,分析RR和RC隔离机制是如何追溯数据的。

        先回顾两个名词,【快照读】和【当前读】

        快照读:RR机制下,第一次查询会生成一个当前时间节点的数据快照,后续该事务中的所有数据查询,都读取当前快照的数据,保证了数据的一致性。

        当前读:RR机制下,第一次查询后,当前事务T未结束前,如果有其他事务对某个数据A做了修改并提交了事务,事务T需要对数据A做update,事务T需要获取数据A的最新结果,以防止脏读和保证数据的一致性。

        即然如此,RR机制下mysql是不是对每个查询事务都生成一个快照呢?原则上是可以通过这种方式实现,但这种方式快照过多,会对数据库资源造成极大的浪费,且事务结束后需删除无用快照,I/O过多也会占用大量资源。由此引出实现快照读的另外几个名词:【undo log】(回滚日志)、【undo log版本链】、【read-view】(一致性视图)。下面根据案例解释这几个名词,并在案例中讲解快照读的实现原理。

        1.2,如何查询事务id

        案例开始前,还需再次回顾上一章内容,如何查询mysql事务id:

SELECT * FROM information_schema.INNODB_TRX;

        1.3,mysql表隐藏字段

        本章节案例还是使用前面章节使用的表t_account,表数据如下

        表中可见只有三个字段:id, name, balance. 实则mysql添加了两个隐藏字段:trx_id(事务id),roll_pointer(回滚指针)。案例中将讲解这两个字段的作用。

2,案例讲解MVCC原理

        案例的事务操作顺序很重要,顺序错误将导致不同的结果,思维如果对顺序的概念不强也很难理解,所以每步操作和顺序都将命名且排序。

        操作一:事务A开启事务,查询当前ID = 4 的数据,即原数据。并查询当前事物ID,即已提交的事务ID = 421991945340720。

        操作二:事务B开启事务,修改id=4的数据,更改balance = 5,不提交事务。查询当前事物B的事务ID = 103386,如下图:

        操作三:事务C开启事务,查询id=4的数据,不提交事务。查询事务C的事务id = 421991945341624,如下图:

        操作先暂停。根据前面的知识,此时事务C查询id=4的数据,balance = 6000.

        当前操作流程可用下图表示:

        【undo log】:用来回滚 增/删/改 操作的回滚日志。如:事务insert一条数据,则该事务的【undo log】就是delete语句;

        【trx_id】:当前操作的事务ID;

        【roll_pointer】:当前事物指向【undo log】的指针,表示当前事务如果回滚,将执行哪个【undo log】语句。如上图,事务A修改数据,则事务A的【roll_pointer】指针指向原数据,如果事务A回滚,id = 4的数据将回滚到原数据。事务B时查询事务,不用回滚,所以没有【undo log】.

        【undo log版本链】:是指一行数据被多个事务依次修改过后,在每个事务修改完后,Mysql会生成并保留undo log,并且用两个隐藏字段trx_id和roll_pointer把这些undo日志串联起来形成一个历史记录版本链,如上图的黑色箭头。

        MVCC的数据可见性是如何实现可重复读的呢?

        事务B在读取数据时,获取了当前时间节点的【read-view】,【read-view】的查找逻辑如下:

1,在当前查询的时间节点,查询数据库所有未提交的事务ID,放在数组中。当前案例数据:

        uncommitted_trx_ids[] = {103378};

2,获取当前已提交的最大事务ID。当前案例数据:max_trx_id = 421991945340720。

        事务C的可重复读,是通过当前事务中数据的可见性实现的。数据可见性实现原理:

1,数据操作执行顺序是按照上图中绿色箭头,依次往下执行,事务ID递增;        
2,事务里的任何sql查询结果,需要从当前对应版本链里的最新数据(即当前事务ID),开始逐条向上(按上图红色箭头顺序)跟【read-view】做比对,从而得到最终的快照结果。

        当前案例比对过程:

1,查询时获取当前事务C的【read-view】: uncommitted_trx_ids[] = {103378},max_trx_id = 421991945340720

2,按照上图中红色箭头依次向上获取事务ID,与当前事务的【read-view】数据作比对。向上比对一条,即比对事务B的trx_id = 103378。事务ID在当前所有未提交事务数组中,该数据不可见;

3,向上比对一条,即比对事务A的trx_id = 421991945340720。事务ID是当前最大已提交事务,数据可见,获取该事务ID对应的数据,即 balance = 6000.        

        总结: 

【可重复读】:查询时获取一次【read-view】,所有未提交事务的数据不可见,最大已提交事务数据可见。由此保证了可重复读。

【读已提交】:每次查询时都获取最新的【read-view】,所有未提交事务的数据不可见,最大已提交事务数据可见,保证了每次提交的最新数据都可见。

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

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

相关文章

Spring Integration + MQTT

1. 简介 Spring Integration: Spring Integration是一个开源的Java库,用于构建基于消息的应用程序。它提供了一套丰富的组件和工具,使得开发者可以轻松地开发出可靠、灵活和可扩展的集成解决方案。以下是Spring Integration的一些主要用途&…

剪辑视频怎么学?四大工具助你轻松入门!

无论是制作短视频、记录生活点滴,还是从事专业影视制作,掌握视频剪辑技巧都至关重要。那么,剪辑视频怎么学呢?本文将为大家推荐四款实用的视频剪辑工具,助你轻松入门! 福昕视频剪辑:简单易用&a…

基于SpringBoot+Vue的医院预约挂号管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

使用Postman搞定各种接口token实战!

现在许多项目都使用jwt来实现用户登录和数据权限,校验过用户的用户名和密码后,会向用户响应一段经过加密的token,在这段token中可能储存了数据权限等,在后期的访问中,需要携带这段token,后台解析这段token才…

1.1 前端技术的发展

大家好!今天,我将与大家分享一个非常有趣的话题——前端技术的发展。在这个数字化时代,前端技术已经成为我们日常生活中不可或缺的一部分。我们的学习目标是了解前端技术的发展,并探讨使用框架开发项目的优势。 首先,…

基于大模型LLama2+Langchain构建知识库问答系统

1 背景 知识库需求在各行各业中普遍存在,例如制造业中历史故障知识库、游戏社区平台的内容知识库、电商的商品推荐知识库和医疗健康领域的挂号推荐知识库系统等。传统知识库搜索系统基于关键字匹配,缺少对用户问题理解和答案二次处理能力。为保证推荐系…

Go-知识泛型

Go-知识泛型 1. 认识泛型1.1 不使用泛型1.2 使用泛型 2. 泛型的特点2.1 函数泛化2.2 类型泛化 3. 类型约束3.1 类型集合3.2 interface 类型集合3.2.1 内置interface类型集合3.2.2 自定义interface类型集合3.2.2.1 任意类型元素3.2.2.2 近似类型元素3.2.2.3 联合类型元素 3.2.3 …

腾讯云直播录制相关

直播录制的原理是什么? 对于一条直播流,一旦开启录制,音视频数据就会被旁路到录制系统。主播的手机推上来的每一帧数据,都会被录制系统追加写入到录制文件中。 一旦直播流中断,接入层会立刻通知录制服务器将正在写入的…

for深入学习作业

作业&#xff1a; 写一个程序判断1-100中9的个数 代码: #include<stdio.h> int main() {int i 9,sum0;for (i 9; i < 100; i) {if ((i % 10 9) || (i / 10 9)) {sum;}}printf("%d", sum);return 0; } //9 19 29 39 49 59 69 79 89 99 //91 92 93 94 …

LVGL设计汽车仪表盘(开源!!)

驾驶界面图 有图无真相&#xff0c;下面视频展示&#xff1a; 汽车仪表盘展示 资源已绑定&#xff0c;自行下载哦 关注我&#xff0c;后面出LVGL移植教程&#xff01;

在线拍卖|基于springBoot的在线拍卖系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 摘要 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单管理、留言板管理、系统管理&#xff0c;用户&am…

【动手学电机驱动】 TI InstaSPIN-FOC(1)电机驱动和控制测试平台

【动手学电机驱动】 TI InstaSPIN-FOC&#xff08;1&#xff09;电机驱动和控制测试平台 1. 本系列的资源需求1.1 电机驱动控制概况1.2 InstaSPIN-FOC 电机控制方案1.3 资源需求 2. 软件安装2.1 安装 CCS2.2 安装 MotorWare2.3 安装 ControlSUITE&#xff08;可选&#xff09; …

中科星图GVE(案例)——AI实现地块提取

目录 简介 函数 gve.Services.AI.plotExtraction(image) 代码 结果 知识星球 机器学习 简介 AI可以通过图像处理和机器学习算法实现地块提取。首先&#xff0c;AI可以对高分辨率遥感图像进行预处理&#xff0c;包括图像校正和去噪等处理。然后&#xff0c;AI可以使用图…

如何挑选Axure元件库? Axure原型赏析

在挑选Axure元件库时&#xff0c;可以从以下几个方面进行考虑和赏析&#xff0c;以确保选择到最适合项目需求的元件库&#xff1a; 一、元件库的全面性和丰富度 组件全面&#xff1a;优秀的Axure元件库应包含丰富的元件类型&#xff0c;以高效应对各种复杂业务流程的原型设计…

探索OAuth 2.0授权模式:全面解析与场景应用选择

文章目录 1. 什么是OAuth 2.0授权模式&#xff1f;2. 授权模式详解2.1 客户端凭证模式&#xff08;Client Credentials Grant&#xff09;2.2 授权码模式&#xff08;Authorization Code Grant&#xff09;2.3 简化模式/隐藏式&#xff08;Implicit Grant&#xff09;2.4 密码模…

解决:Ubuntu连接不上网络

今天莫名奇妙&#xff0c;我的ubuntu20.04断网了。检查了一下&#xff0c;使用的也是桥接模式&#xff0c;啥也没有变化。 然后我上Ubuntu16.04版本看了&#xff0c;那里又可以成功上网&#xff0c;所以&#xff0c;不是电脑的问题。 看了网上两个教程&#xff0c;解决了。 …

深入理解 Maven Profiles

前言 在现代软件开发中&#xff0c;项目通常需要部署到多种环境中&#xff0c;比如开发&#xff08;development&#xff09;、测试&#xff08;test&#xff09;和生产&#xff08;production&#xff09;。每种环境可能具有不同的配置需求。为了满足这种多样性&#xff0c;A…

还在找地图切片工具?这五款免费软件值得一试

地图切片&#xff08;Map Tiling&#xff09;是指将大型地图或影像数据按照一定的规则切割成多个较小的图块&#xff08;称为瓦片&#xff09;&#xff0c;并根据缩放级别和用户请求逐步加载这些瓦片&#xff0c;从而提升地图在网络或应用中的显示速度和效率。地图切片技术广泛…

ABAP SE37创建FUNCTION报错:函数的主程序不是以function-pool开头

问题&#xff1a;SE37在新建函数时&#xff0c;检查语法没有问题&#xff0c;但激活报错&#xff1a;函数"***"的主程序不是以function-pool开头; 原因&#xff1a;新建函数的函数组没有激活&#xff0c;可以通过se80或在SE37跳转进行激活 按一下路径 右键激活即可

变倍镜头参数详解

变倍镜头是一种重要的光学镜头&#xff0c;其参数对于了解镜头的性能和适用场景至关重要。以下是对变倍镜头参数的详细解释&#xff1a; 变焦倍数&#xff1a; 定义&#xff1a;变焦倍数是变倍镜头的一个关键参数&#xff0c;表示镜头最长焦距与最短焦距的比值。作用&#xff1…