MVCC(解决MySql中的并发事务的隔离性)

news2024/11/25 13:32:11

 MVCC


如何保证事务的隔离性?

1.排他锁:如一个事务获取了一个数据行的排他锁,其他事务就不能再获取改行的其他锁。

2.MVCC:多版本并发控制。

58c8c1d5224e4dc39460b7d8acbdd2b5.png

MVCC:

30c39da925854364b6c6a7110ce0493f.png

1.隐藏字段

d1562e911d084c8487736cc3614411ff.png

1.DB_TRX_ID:最近修改事务的id。默认值从0开始,每次被修改自增1。也就是说每有一个事务修改了当前数据,这条数据的该字段就会自增1。(从而实现记录最近''修改事务''的id)

2.DB_ROLL_PTR:回滚指针。举个例子:对于这里id为1的数据,进行了三次修改。DB_TRX_ID就是3。但是,.DB_ROLL_PTR记录的是该行数据第一次修改时的版本。也就是第一次修改的事务id -> 1。这样后面配合undo log就知道回滚到上一个版本(就是三次修改前的版本)。

3.DB_ROW_ID:隐藏主键。当前表指定了主键,该字段就没啥意义了。

2.undo log

37d03c9e515c437d9c4a19f4f4d999c1.png

undo log版本链

32139e37ffb347e6a8b5284f9868fe92.png

这里每有一个事务修改当前行数据,就像链表中的尾插法一样,插入一个节点。

3.readView

a4f50feb25ee406ca1e3912c882ad0ff.png

RC (读提交):

        在RC隔离级别下,事务在执行每次读取操作时都会生成一个新的读视图(Read View)。这意味着每个读取操作都会基于当前活跃的事务ID(即未提交的事务)来构建一个一致性视图。因此,在RC隔离级别下,事务可能看到其他事务提交的更新,但这些更新必须是当前事务开始读取操作时已经存在的。换句话说,RC隔离级别允许不可重复读,即在一个事务中多次读取相同的记录可能会得到不同的结果,因为它可能看到了其他事务提交的更新。

RR (可重复读):

        相比之下,在RR隔离级别下,事务在启动时会创建一个读视图,并在整个事务的生命周期内保持不变。这意味着一旦事务开始,它将看到所有已经提交的记录的稳定视图,直到事务结束。在RR隔离级别下,即使其他事务在当前事务执行期间提交了更新,当前事务也不会看到这些变化,因为它已经有了一个稳定的数据快照。因此,RR隔离级别提供了可重复读的保证,即在一个事务中多次读取相同的记录将会得到相同的结果。

06e392b2e69144e192439beb39564d92.png

举个例子:现在是事务5执行第一条查询sql。

m_ids (当前活跃的事务):3、4、5(事务2已提交)

min_trx_id:3 (3、4、5中最小的id)

max_trx_id:6 (5+1)

creator_trx_id:5 (当前事务5做了查询,ReadView由事务5创建)

版本链数据访问规则:

0f8f198e887a42629821b9529f9e40b0.png

RC级别下的访问:

3c18e6d4e87f45a0a1dcc1142dd1ae78.png

在这个例子中:根据版本链数据访问规则事务5第一个sql对应的查询结构是事务2修改后的数据。原因:根据版本链从最新事务4开始比较。

此时:creator_trx_id = 5;min_trx_id = 3;max_trx_id = 6

4所有条件都不满足,事务3也都不满足。只有事务2满足:trx_id (2) < min_trx_id(3)。

同理,对于事务5第二条查询,也能得到结果。第二条sql查询的是事务3修改后的数据。

RR级别下的访问:

dc62ddd27faf44489a488093ca4f000d.png

由于RR多次查询,都只生成最初的一个视图。因此我们只需要搞明白第一个视图的查询结果。同上方法可知,这里也是查询到事务2修改后的数据。

总结:

1077a64480b64acc9430506402922349.png

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

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

相关文章

React添加到现有项目

1.检查现有项目的根目录下是否有package.json文件 如果没有&#xff0c;则在项目的根目录下初始化一个package.json配置文件 2.在根目录下安装react和react-dom依赖 npm install --save react react-dom react-scripts安装成功后&#xff0c;react、react-dom以及react-scr…

RPA实战演练UiBot6.0新食堂一楼问卷星(类似于之前的网页表单提交)

要使用RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;帮助新食堂进行调查问卷&#xff0c;我们可以结合UiBot 6.0来实施具体的计划。以下是一个大致的实战演练计划&#xff1a; 一、目标与需求分析 明确调查目标&#xff1a;了解新食堂…

小间距LED显示屏拼接器的技术详解

随着科技的不断进步&#xff0c;小间距LED显示屏因其无缝拼接、高清晰度和卓越的显示效果&#xff0c;在众多高端应用场合成为首选。然而&#xff0c;要充分发挥这些优势&#xff0c;不仅需要LED显示屏本身的高质量图像处理和精湛的组装工艺&#xff0c;还需要一个强大的图像拼…

Java 语言程序设计(基础篇)原书第10版 梁勇著 PDF 文字版电子书

简介 Java 语言程序设计&#xff08;基础篇&#xff09;原书第 10 版 是 Java 语言的经典教材&#xff0c;中文版分为基础篇和进阶篇&#xff0c;主要介绍程序设计基础、面向对象程序设计、GUI 程序设计、数据结构和算法、高级 Java 程序设计等内容。本书通过示例讲解问题求解…

【python】图像边缘提取效果增强方法-高斯模糊

一、介绍 高斯模糊是一种常用的图像处理技术&#xff0c;用于减少图像中的噪声和细节。它通过对图像中的每个像素点进行加权平均来实现模糊效果。具体而言&#xff0c;高斯模糊使用一个高斯核函数作为权重&#xff0c;对每个像素点周围的邻域进行加权平均。这样可以使得每个像…

Golang ProtoBuf 初学者完整教程:语法

一、编码规范推荐 1、文件名使用小写下划线的命名风格&#xff0c;例如 lower_snake_case.proto 2、使用 2 个空格缩进 3、包名应该和目录结构对应 4、消息名使用首字母大写驼峰风格(CamelCase)&#xff0c;例如message StudentRequest { ... } 5、字段名使用小写下划线的风格…

【优选算法专栏】专题十:哈希表(一)

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

【springboot开发】MVC和SSM

前言&#xff1a;关于MVC和SSM基本内容的梳理&#xff0c;以及两者之间的关系。 文章目录 1. 三层架构2. MVC3. SSM 1. 三层架构 三层架构是指&#xff1a; 视图层view&#xff08;表现层&#xff09;: 用于显示数据和接收用户输入的数据&#xff0c;为用户提供一种交互式操作…

cpufreq --- 漏洞

我在12日早上发现并上传该漏洞到mainlist&#xff0c; 被毫无道德底线和丑恶人性的印度人截胡了. 这个贪婪、自私的印度人看了我的patch后首先说了一封冠冕堂皇的邮件给我让我不要再次修复&#xff0c;下午2点&#xff0c;人性的丑恶在这厮身上全部散发出来了&#xff0c;它用另…

Unity中图片和Base64字符串之间的转换

大家好&#xff0c;我是阿赵。   这次来讲一下在unity引擎里面&#xff0c;图片和base64字符串的互相转换问题。 一、图片传输的多种方式 有时候我们需要把图片通过网络传输发送。   在Unity里面&#xff0c;有不止一种方式可以实现&#xff0c;比如说&#xff0c;把图片的…

HarmonyOS4 页面路由

Index.ets: import router from ohos.routerclass RouterInfo {// 页面路径url: string// 页面标题title: stringconstructor(url: string, title: string) {this.url urlthis.title title} }Entry // 入口組件 Component struct Index {State message: string 页面列表// …

java快速幂算法

快速幂算法 参考视频(参考五角七边up大佬&#xff09; 幂运算的介绍 幂运算是指将一个数自身乘以自身多次的运算&#xff0c;其表达式为 a n a^n an&#xff0c;其中 a a a 是底数&#xff0c; n n n 是指数。 快速幂解释 快速幂算法是一种用于快速计算幂运算的算法&…

MySQL的基础操作(二)

目录 一.数据库约束 1.主键约束 (Primary Key) 2.唯一约束 (Unique) 3.外键约束 (Foreign Key): 4.检查约束(Check) 5.默认约束 (Default) 二.聚合查询 1.简单聚合函数 2.GROUP BY子句 3.HAVING子句 三.联合查询 1.内连接 2.左连接 3.右连接 4.子查询 5.合并查询…

OpenHarmony开发——CMake方式组织编译的库移植

概述 本文为OpenHarmony开发者提供一些组织编译形式比较常见&#xff08;CMakeLists、Makefile&#xff09;的三方库的移植指南&#xff0c;该指南当前仅适用于Hi3516DV300和Hi3518EV300两个平台&#xff0c;文中着重介绍各编译组织方式下工具链的设置方法以及如何将该库的编译…

NJU PA0

NJU PA0 使用教程提供的源再进行sudo apt install … 可能会出现 Unmet dependencies 此类报错 可以安装 aptitude sudo apt install aptitude sudo aptitude install <package>然后它会提示你&#xff0c;选 n 进行降级。再选 Y 确认 或者 将 /etc/apt/sources.list 下…

SpringSecurity登录时在哪里调用我们自定义的UserDetailsServiceImpl

SpringSecurity登录时在哪里调用我们自定义的UserDetailsServiceImpl 1、请求login方法 2、将用户的用户名和密码封装成一个对象&#xff0c;以便进行后续的认证操作 3、执行认证操作 4、调用providermanager类的authenticate 5.进入这一步就开始跟我们自定义实现的UserDet…

带头结点的双向循环链表操作集

分数 50 作者 伍建全 单位 重庆科技大学 本题要求实现一个带头结点的双向循环链表操作集。 函数接口定义&#xff1a; typedef int dataType;typedef struct _node {dataType data;struct _node *prev;//指向前驱的指针struct _node *next;//指向后继的指针 }node;typedef…

Windows安装MongoDB结合内网穿透轻松实现公网访问本地数据库

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

PandasAI的应用与实战解析(二):PandasAI使用流程与功能介绍

文章目录 1.使用PandasAI进行开发的流程2.配置文件解析3.支持的数据库类型4.支持的LLMs5.其他 PandasAI这个工具最突出的优点就是通过结合了Pandas和生成式LLMs&#xff0c;极大地为开发人员降低了工作量。 传统的开发调用流程&#xff08;数据分析相关&#xff09;&#xff1a…

秒杀购物商城核心服务 — 商品管理中心(前提设计概要)

秒杀购物商城核心服务 前提介绍商品中心中台支持系统-总体架构设计&#xff1a;商品与产品商品 类目属性类目定义前后台类目后台类目&#xff0c;关注标准化管理类目属性及分类 SKUSPU 属性库建设 前提介绍 在电商系统中&#xff0c;商品模型占据着举足轻重的地位&#xff0c…