MySql的中的MVCC解决事务隔离性

news2024/9/22 23:16:59

  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/1964491.html

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

相关文章

ShardingSphere-Jdbc + Spring Security + Redis 实现简单JWT认证

1. 项目结构 2. 数据库相关操作 create database user_profiles; use user_profiles; CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(255) NOT NULL UNIQUE,password VARCHAR(255) NOT NULL,email VARCHAR(255) UNIQUE,role VARCHAR(2…

数据结构之《二叉树》(上)

在之前的数据结构的学习中&#xff0c;我们了解了顺序表、链表等线性表&#xff0c;接下来在本篇中将要学习一种非线性的数据结构——树&#xff0c;我们将来了解树的相关概念和性质&#xff0c;在树当中将重点学习二叉树的结构和特性。学习完相关概念后将试着实现二叉树&#…

我是怎么解决一个电力采集问题的全过程分享

行业设备联网&#xff0c;没人开发/开发太慢/投入太大 怎么办&#xff1f;用合宙DTU整体解决方案&#xff01; 一、整体解决方案内容 合宙DTU整体解决方案 DTU硬件&固件SIM卡业务云平台APP&小程序&web h5页面看板&#xff1b; 合宙提供的DTU整体解决方案&#x…

免费【2024】springboot 宠物中心信息管理系统app

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

【超级宠物】-对战游戏

【超级宠物】是一款轻松好玩的休闲趣味卡通宠物模拟养成游戏,游戏中玩家需要不断的训练你的小宠物以参加比赛,你将会是一名专业的训宠物大师,成功的培养自己的宠物成为宠物之星。 超级宠物是一款充满趣味的休闲趣味宠物养成模拟竞技游戏&#xff0c;游戏中玩家需要培养你的狗狗…

Ollama0.3.0 + llama3.1本地部署

Ollama0.3.0 llama3.1本地部署 安装Ollama 官网下载安装包 https://ollama.com/download ​​ 根据系统选择对应版本 安装完成后&#xff0c;电脑右下角会出现ollama程序图标&#xff0c;表示ollama正在运行。 ​​ 打开cmd命令 下载Llama3.1 输入ollama&#xff0c…

51单片机嵌入式开发:22、STC89C52R控制 实现单总线温度传感器DS18b20的温度读取

STC89C52R控制 实现单总线温度传感器DS18b20的温度读取 1 概述1.1 介绍1.2 特点1.3 应用领域 2 DS18B20原理详解2.1 内部机理2.2 读写时序2.3 DS18B20操作代码程序 3 演示4 总结 配套演示例程 1 概述 DS18B20是一款数字温度传感器&#xff0c;由Maxim Integrated&#xff08;美…

linux下frambuffer的使用

什么是Framebuffer&#xff1f; Framebuffer是一个内存区域&#xff0c;操作系统可以通过它直接控制显示设备的像素。与传统的图形加速硬件不同&#xff0c;framebuffer不依赖于图形处理器&#xff0c;而是通过CPU来处理图形数据。这种方式虽然在性能上可能不如硬件加速&#…

vegecad画线及调整功能

vegecad添加了绘制直线和层颜色&#xff0c;目前没有线型&#xff0c;点击工具按钮"画线"&#xff0c;画线是连续的画&#xff0c;右键结束&#xff0c;下面是画的 vegetable&#xff0c;目前画线没有捕捉和引导线画特定角度的线&#xff0c;所以现在还是涂鸦式的&am…

昇思25天学习打卡营第XX天|RNN实现情感分类

希望代码能维持开源维护状态hhh&#xff0c;要是再文件整理下就更好了&#xff0c;现在好乱&#xff0c;不能好fork tutorials/application/source_zh_cn/nlp/sentiment_analysis.ipynb MindSpore/docs - Gitee.com

Redis架构之主从复制

Redis主从架构 主从集群&#xff0c;实现读写分离 主从数据同步 主从同步流程 slave节点向master节点发送replicaof命令建立连接&#xff0c;随后发送 psync {repID} {offset} 指令&#xff0c;repID表示主节点唯一标识&#xff0c;offset为复制偏移量。如果是第一次同步&…

软件测试——Bug篇

什么是BUG 定义&#xff1a; ⼀个计算机bug指在计算机程序中存在的⼀个错误(error)、缺陷(flaw)、疏忽(mistake)或者故障(fault)&#xff0c;这些bug使程序⽆法正确的运⾏。Bug产⽣于程序的源代码或者程序设计阶段的疏忽或者错误。 准确的来说&#xff1a; 1. 当且仅当规格说…

Java面试——Tomcat

优质博文&#xff1a;IT_BLOG_CN 一、Tomcat 顶层架构 Tomcat中最顶层的容器是Server&#xff0c;代表着整个服务器&#xff0c;从上图中可以看出&#xff0c;一个Server可以包含至少一个Service&#xff0c;用于具体提供服务。Service主要包含两个部分&#xff1a;Connector和…

【C语言】“void” 如何在 C 语言中开创无限可能

目录 C语言void关键字详解void关键字的功能和应用详细说明 1. void作为函数返回类型示例代码输出结果 2. void作为函数参数示例代码输出结果 3. void*通用指针示例代码输出结果 4. void与NULL示例代码输出结果 5. void与函数指针示例代码输出结果 6. void的限制和注意事项6.1 不…

AI技术革命对未来就业的影响

一、引言 AI技术革命带来的就业结构变化是双面的&#xff0c;既存在着挑战也蕴含着机遇。过去的几次技术革命例如工业革命和信息技术革命都对就业结构产生了深刻的影响&#xff0c;使一些工作消失&#xff0c;也催生了许多新的工作类型。当前和未来的AI技术发展也必将推动类似…

Vue3 + js-echarts 实现前端大屏可视化

1、前言 此文章作为本人大屏可视化项目的入门学习笔记&#xff0c;以此作为记录&#xff0c;记录一下我的大屏适配解决方案&#xff0c;本项目是基于vite Vue3 js less 实现的&#xff0c;首先看ui&#xff0c;ui是网上随便找的&#xff0c;代码是自己实现的&#xff0c;后面…

昇思25天学习打卡营第XX天|基于MindSpore通过GPT实现情感分类

其实数据集和模型的其他大平台接口的&#xff0c;感觉不用非包在自己包里 %env HF_ENDPOINThttps://hf-mirror.com mindnlp.transformers 库中的 GPTTokenizer 类来加载和处理与GPT&#xff08;生成式预训练变换器&#xff09;模型兼容的分词器&#xff0c;并添加特殊的控制标…

Vmware创建centos后使用yum报错(网络连接正常)

安装完centos虚拟机后&#xff0c;yum报错信息如下&#xff1a; 快速解决方法 删除原有yum文件 rm -f /etc/yum.repos.d/CentOS-Base.repo 然后重新下载阿里的&#xff1a; wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 清理…

ctfshow-web入门-sql注入(web171-web175)

目录 1、web171 2、web172 3、web173 4、web174 5、web175 1、web171 单引号测一下&#xff0c;报错 -- 闭合后回显正常 也可以用 # &#xff0c;不过需要 URL 编码 成功闭合之后&#xff0c;先判断下字段数&#xff1a; 1 order by 3-- 3 的时候正常 4 的时候报错&am…

MyBatis 动态代理和映射器

一、映射器简介 1.什么是mapper动态代理? 在接口中有方法的返回值定义&#xff0c;参数的定义&#xff0c;方法名&#xff0c;在sqlMapper.xml 中也对应这接口给予了赋值&#xff0c; 这时候dao的实现类就显得多余&#xff0c;这是Mybatis可以帮助我们自动产生实现类&#xf…