少年,你可听说过MVCC?

news2024/11/25 2:48:51

:切!这谁没听过,不就是多版本并发控制么~

早在亘古时期,修真界就流传着一门mysql功法,将其修至小乘境界,足以纵横一方。。。不乏也有走火入魔者,为祸一方~

Serializable篇

强制事务排序,串行化执行事务。技能之间不存在冲突,就是滚键盘~能不能再快点呢,技能前摇那么长,一次性放俩多好^_^

Read Uncommitted篇

某个不知名大牛路过你这样搞一下试试:

事务1事务2
select * from table where key = 1;
update table set name="da niu" where key = 1;
select * from table where key = 1;

看到了没,事务1第一次查询的结果和第二次查询的结果还能一样吗,this is 脏读!

Read Committed篇

原来这就是脏读啊,那我等到事务2提交之后再读,不就ok了吗^_^

事务1事务2
select * from table where key = 1;
update table set name="da niu" where key = 1;
commit
select * from table where key = 1;

你能说事务1第二次读出来的数据是脏的吗?不能。但是事务一两次读取的数据结果仍然不同,这叫做不可重复读问题。

Repeatable Read篇

这还怎么搞。。。

据说是有个头秃哥,搞了叫Read View个东西出来。Read View可以认为是数据库的一个内部快照,根据事务的隔离级别,决定在事务开始时,该事务能看到什么信息。就是说通过Read View,事务可以知道此时此刻能看到哪个版本的数据记录(有可能不是最新版本的,也有可能是最新版本的)。可重复读、读已提交、读未提交,这几个隔离级别都会使用Read View。

ReadView中主要包含几个比较重要的字段:

creator_trx_id创建Read View事务的id
trx_ids生成Read View时活跃的事务id集合
up_limit_idtrx_ids中最小的事务id
low_limit_id生成Read View时下一个可分配的事务id

有了这些id信息,即使事务2已提交的情况下,也不会出现可重复读的问题了:

事务1事务2
select * from table where key = 1;(获取Read View)
update table set name="da niu" where key = 1;
commit
select * from table where key = 1;(获取Read View)

第一次查找获取Read View,当前事务id为0,该行数据的trx_id小于事务1Read View中的up_limit_id,即该行数据为事务1创建之前产生的,故而对事务1可见;

第二次查找,该行数据的trx_id被事务2改为了自己的事务id,使得trx_id在事务1Read View的trx_ids中,说明改行数据由创建事务1时的其它活跃事务更新过,故而使其对事务1不可见;

:数据就没。。没了?

当然不会,还记得undo log吗,记录了数据库操作的执行逻辑。我们对这行数据再做一次相反的执行逻辑,就能拿到修改前的数据了^_^

类似的,如果在事务1创建之后,又有事务3被创建,并修改了key=1的数据,则该行记录的trx_id大于等于事务1Read View中的low_limit_id,也可以知晓当前数据被修改过来。继续根据undo log恢复以前版本的数据即可。

这就是多版本并发控制了。。。

幻读篇

那幻读又是啥呢??

前面说了不可重复读的问题,是说同一个事务中,多次查询同一条记录,查询结果不同的问题;

幻读其实也很简单,说的是同一个事务中,查询多次,查询结果记录条数不一致的问题;

明白了吧,一个是说记录本身的内容发生变化,另一个说的是记录的条数。

显然,通过MVCC,也能解决幻读的问题了

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

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

相关文章

【MCS-51】中断系统原理及应用

中断是单片机中一个十分重要的功能,它的出现能够让我们的单片机在顺序执行命令时,具备应对特殊情况的能力。 目录 🌙通信方式 🍃无条件传送 🍃有条件传送 🍃DMA通信 🍃中断传送 &#x1…

python计算程序开始、结束以及运行的时间

python 计算程序运行的耗时,主要有三种方法: time.time() 、 time.perf_counter() 和 datetime.datetime.now()方法 使用方法如下: 1. time.time() import time start time.time() # 程序开始时间,单位为秒 print("start_time:&…

C++ [STL之list的使用]

本文已收录至《C语言和高级数据结构》专栏! 作者:ARMCSKGT 前言 vector是一片连续的空间,在数据访问上性能较好,但是任意位置插入删除性能较低,头插头删性能亦是如此;此时在这种需要频繁插入的场景下&…

PCL计算法向量结果不对的问题

一、点云(高程渲染。CC计算的法向量,Z分量渲染) 高程渲染 法向量Z分量的绝对值渲染 二、PCL计算法向量 下面是PCL计算法向量的代码(点类型自己设置的) 计算出的法向量有正有负 void pclNormalEstimation(pcl::Point…

【C++】构造函数初始化列表的特性以及注意事项

文章目录 一、1.1构造函数体赋值:二、 初始化列表2.1初始化基本形式,注意:3. 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。4. 成员变量…

JavaScript教程(二)

BOM浏览器对象模型 什么是BOM BOM(Browser Object Model)即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是 window;BOM由一系列相关的对象构成,并且每个对象都提供了很多方…

deepfloyd/IF

Stable Diffusion团队放大招!新绘画模型直出AI海报,实现像素级图像生成AI画文字终于能画对了https://mp.weixin.qq.com/s/_pwBD4-wLA9zNHBpD6WdNgDeepFloyd IF — DeepFloydhttps://deepfloyd.ai/deepfloyd-ifhttps://colab.research.google.com/#scroll…

微服务开发系列 第八篇:Elasticsearch

总概 A、技术栈 开发语言:Java 1.8数据库:MySQL、Redis、MongoDB、Elasticsearch微服务框架:Spring Cloud Alibaba微服务网关:Spring Cloud Gateway服务注册和配置中心:Nacos分布式事务:Seata链路追踪框架…

gradle快速入门

1.Gradle 入门 1.1 Gradle 简介 Gradle 是一款Google 推出的基于JVM、通用灵活的项目构建工具,支持Maven,JCenter 多种第三方仓库;支持传递性依赖管理、废弃了繁杂的xml 文件,转而使用简洁的、支持多种语言(例如:java、groovy 等…

如何成功申请计算机软件著作权【申请流程完整记录】

致谢 :此博文的编写包括软著的申请,均借鉴了大佬【万里守约】的博客,很幸运一次性通过 — 提示:此博文仅适合个人申请,因为我是自己一个人的项目,自己一个人申请软著 文章目录 前言:一、网站注册…

HCIA-RSTP,MSTP

目录 STP的不足 RSTP对STP的改进 1,配置BPDU的处理发生变化: 2,配置BPDU的格式发生变化,充分利用STP的flag字段,明确接口角色。 3,RSTP拓扑处理: 端口角色: MSTP(多…

Inline HOOK

一、Inline HOOK介绍 1、内联钩子简介 Inline hook(内联钩子)是一种在程序运行时修改函数执行流程的技术。它通过修改函数的原始代码,将目标函数的执行路径重定向到自定义的代码段,从而实现对目标函数的拦截和修改。 内联钩子通…

Flume学习笔记

1 简介 (1) Apache Flume是一个分布式、可信任的数据采集、日志收集弹性系统(框架),用于高效收集、汇聚和移动大规模日志信息从多种不同的数据源到一个集中的数据存储中心(HDFS、Hbase或者本地文件系统) (2) 可信任是指保证消息有效的处理和传递: 如果…

聊聊Go语言的控制语句

在高级编程语言中,控制流语句(control-flow statement)是一类用于控制程序执行流程的语句,以下简称为控制语句。它们可以根据条件或循环执行相应的代码块,或者跳转到指定位置执行代码。 常见的控制语句包括: 条件语句:…

【特征选择】基于二进制粒子群算法的特征选择方法(GRNN广义回归神经网络分类)【Matlab代码#32】

文章目录 【可更换其他算法,获取资源请见文章第6节:资源获取】1. 特征选择问题2. 二进制粒子群算法3. 广义回归神经网络(GRNN)分类4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法,获取资源请见文章第6节…

2023年Github学生包认证,提取JetBrains全家桶,认证Copilot 等多种权益

什么是GIthub学生包 1 Github学生包简而言之是可以白嫖100美刀的微软Azure(每年),200美刀的DigitalOcean金额(一年有效期)总计300刀可用来购买云服务器。 2 一年免费的.tech .me .live三种顶级域名(可以分…

Kubernetes 云原生 Gateway 网关

一、云原生定义 CNCF 对云原生的定义中提到了几个关键的点: 1、强调应用环境的动态性,像公有云、私有云、混合云等新型的动态环境已成为大多数应用的首选; 2、强调在跨多云部署应用时具备非云平台绑定的属性; 3、还强调了弹性扩展…

Python系列模块之标准库shutil详解

感谢点赞和关注 ,每天进步一点点!加油! 目录 一、shutil介绍 二 、使用详解 2.1 复制函数 2.1.1 shutil.copy 2.1.2 shutil.copy2 2.1.3 shutil.copyfile 2.1.4 shutil.copytree 2.2 移动文件 2.2.1 shutil.move 2.3 删除文件 2.3…

Vue-后台管理项目001---侧边栏

从浏览器上可以看出,他的返回值是promise(pending),所以我们可以用async,await来简化这个操作 await只能用在被async修饰的方法中,需要把仅挨着await的方法修饰成async 需要把仅挨着await的方法修饰成异步的async现在可以将这个da…

1-1 统计数字问题

题目: 我的答案: 一、信息 二、分析 1.如何选择数据结构? 2.如何选择算法有很多思路? 3.如何用文件实现输入输出? 三、思考 疑问1 我选择了一开始数组选择使用数组是一个不错的选择,尤其在这个问题中…