Mysql 事务版本链(RR 与 RC 的本质区别)

news2024/11/17 7:37:50

版本链其实就是CURD的历史记录,回滚的本质也是用版本链中的最近一条历史记录覆盖当前记录。版本链针对的是每个表中的记录,只要表中有任意一条记录被修改,版本链中就会新增一条历史记录。


         目录

1、为什么需要版本链?

2、有关版本链的前提知识

(1) ReadView

(2) 四个隐藏字段

(3) undo log(回滚日志)

2、单个事务的版本链

3、多个事务的版本链

4、RR 与 RC 的本质区别


1、为什么需要版本链?

一方面允许回滚。如果用户想撤销之前的操作,有了版本链就可以用之前的历史记录来覆盖当前历史记录,从而达到回溯的效果。

另一方面是控制事务的隔离性。先到来的事务无法看到后来的事务作出的修改,不同事务看到的可能是不同版本,修改的也是不同的版本,所以两个事务执行的操作并不会互相影响,这就达到了隔离两个事务的目的。

2、有关版本链的前提知识

(1) ReadView

每当有一个事务到来的时候,Mysql 就会创建一个ReadView(读快照),相当于相机拍下了那一时刻的事务状况,ReadView记录了在当前事务之前有哪些事务处在活跃状态,有哪些事务的历史记录允许被看到等等。

//一张列表,用来维护Read View生成时刻,系统正活跃的事务ID
m_ids; 

// 活跃事务中事务ID的最小值
up_limit_id; 

// 未来事务临界点(下一个事务到来时应该分配的ID,之后到来的事务都属于未来事务,历史记录不可被看到)
low_limit_id;      

// 创建该ReadView的事务ID(快照形成点)
creator_trx_id    

 

(2) 四个隐藏字段

每个表在被创建的时候,都会存在四个隐藏字段。我们对表中的每一条记录作出的任何操作,都会被保存下来(包括谁操作了该条记录、历史记录放在哪、该条记录是否被删除等)

  • DB_TRX_ID:最近修改 / 插入该条记录的ID
  • DB_ROLL_PTR:回滚指针,指向该条记录的上一个版本(一般在undo log)
  • DB_ROW_ID:隐含的自增ID。若数据表无主键, InnoDB 会自动以 DB_ROW_ID 产生一 个聚簇索引
  • flag:用于标识该记录是否被删除

(3) undo log(回滚日志)

其实就是保存日志数据,也就是历史记录。每次执行sql操作都会有历史记录产生,产生的结果将作为历史记录保存到undo日志文件中。针对不同的操作,隐藏字段的填充内容也会不同,产生的日志也会有些许不同:

  • update、delete:可以正常生成版本链
  • insert:因为没有历史记录,所以实际上会插入一条空的历史记录(此时回滚指针为NULL)
  • select:不会对数据作出修改,维护多个版本没有意义,不会生成版本链(历史记录)

 

2、单个事务的版本链

假设有一个10号事务到来,此时会形成一个“读快照”ReadView,记录下该事务到来时,有哪些事务是处于活跃状态、下一个事务到来时,应该分配的事务ID是多少等。

10号事务执行任何sql操作时都会产生历史记录,产生的历史记录保存到 undo log 中,每条记录中的隐藏字段 DB_ROLL_PTR 都会指向上一条历史记录。即便是历史记录也会指向自己的上一条记录。

3、多个事务的版本链

Mysql 中存在多个事务的时候,难免存在多个事务要修改同一行记录的情况,这个时候最好的办法就是加锁。就算有多个事务到来也必然存在先后顺序,此时Mysql会依次给他们创建快照(ReadView)。

假设有一个10号事务要修改记录,这个时候就会给该事务要修改的行加锁(我们称为“行锁”),修改之前将记录拷贝到undo log,这样就有了历史记录;修改完毕以后,释放 “ 行锁 ” 。

然后又有一个11号事务,也是要对同一行修改,首先也是加行锁,其次将之前的记录拷贝到undo log,最后再修改并提交。由此我们可以知道,每个事务可以看到的历史记录不一样,11号事务在10号事务之后,可以看到10号事务提交的记录;但是10号事务无法看到11号事务提交的记录。

 

4、RR 与 RC 的本质区别

从上述事务版本链可以大致了解到,事务是如何实现回滚、产生版本链以及保证彼此之间不会受到影响的。但是不同隔离级别下的事务,允许看到的版本链存在差异,比如读提交(RC)级别下,可以看到其他事务的提交结果;但是可重复读(RR)级别下,无法看到其他事务的执行结果直至当前事务提交。

  • RR级别:只有事务到来的时候,才会形成一次ReadView,之后就不再更新,此后使用的都是同一个ReadView,看到的其他事务的版本链也是固定的。
  • RC级别:每次快照读(查看历史版本)都会生成一个快照 和 ReadView,这就是每次查询出来的记录都是最新的原因。

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

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

相关文章

《爆肝整理》保姆级系列教程python接口自动化(二十四)--unittest断言——中(详解)

简介 上一篇通过简单的案例给小伙伴们介绍了一下unittest断言,这篇我们将通过结合和围绕实际的工作来进行unittest的断言。这里以获取城市天气预报的接口为例,设计了 2 个用例,一个是查询北京的天气,一个是查询 南京为例&#xf…

接口幂等性的通用解决方案golang版

文章目录简介幂等性如何实现前端应当处理后端基于 token redis 处理简介 接口的幂等性是指: 用户对同一个操作发起多次请求,系统的设计需要保证其多次请求后结果是一致的。常见的如支付场景,连续快速点击两次支付 10 元,不应该扣…

阶段八:服务框架高级(第三章:分布式缓存Redis)

阶段八:服务框架高级(第三章:分布式缓存Redis)Day-分布式缓存Redis0.学习目标1.Redis持久化1.1.RDB持久化 【重要】1.1.1.执行时机1.1.2.RDB原理1.1.3.小结1.2.AOF持久化【重要】1.2.1.AOF原理1.2.2.AOF配置1.2.3.AOF文件重写1.3.…

搜广推 WideDeep 与 DeepCrossNetwork (DCN) - 记忆+泛化共存

😄 这节来讲讲Wide&Deep与Deep&CrossNetwork (DCN)。从下图可看出WD非常重要,后面衍生出了一堆WD的变体。本节要讲的WD和DCN结构都非常简单,但其设计思想值得学习。 🚀 wide&deep:2016年,谷歌提出。 🚀 Deep&CrossNetwork (DCN):2017年,谷歌和斯坦…

刷题小抄1-2数之和

时间复杂度和空间复杂度 对于一个算法高效性的评估,分为时间复杂度与空间复杂度两种,在算法优化到极致的情况下,只能舍弃时间来换取空间,或者舍弃空间来换取时间,故而两者可以说是互斥关系 时间复杂度衡量的是算法运行的速度,而空间复杂度衡量的是算法运行所需要的额外内存空…

【Ap AutoSAR入门与实战开发03】-【Ap_s2s模块02】:到底什么是基于信号,什么是基于服务,两者的主要区别是什么?

总目录链接==>> AutoSAR入门和实战系列总目录 文章目录 1 基于信号的通信2 基于服务的通信3 面向服务设计举例在【Ap_s2s模块01】中我们大概讲述了,为什么要有s2s模块,并且简单的阐述了基于信号的通信和基于SOME/IP的服务的通信,我们接下来详细分析一下这两个概念。…

Torch单独层赋值

20230227 - 引言 对于torch中的权值初始化方式,以往都是采用默认的方式,或者利用初始化库里面的函数。但是如果想尝试一些自己的想法,那就必须自己来填充这部分数据,例如看到的内容,利用PCA的公式来对权值进行填充。…

CSGO社区服务器搭建架设服务器配置以及环境准备

CSGO社区服务器搭建架设服务器配置以及环境准备 CSGO作为一款射击动作游戏还原场景真实性广受大批玩家的热爱,很多小伙伴也有想过自己搭建的话需要知道那些东西。 我是艾西,今天跟大家聊聊搭建架设前我们需要知道的事情: Windows&#xff1…

【谷歌grc】recaptcha browser-error 错误

grc 谷歌人机验证错误 https://www.google.com/recaptcha/api/siteverif 返回错误信息 browser-error [{"success": false,"error-codes": ["browser-error"] }]之前都是调通能用的,突然之间就不能用了,查了半天也没有找…

前端实现压缩图片的功能(vue-element)

前言: 随着现在手机像素,拍照功能越来越好,随之而来的是本地图片越来越大,那么如何更好的将本地图片上传到后端接口呢?这是后台管理系统常见的场景和头疼的问题,这里分享下个人的方法。 实现效果&#xff…

java多线程(八)线程等待与线程唤醒2

三、wait(long timeout)和notify() wait(long timeout)会让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。 下面的示例就是演示…

入职数据分析公认的好书|建议收藏

众所周知,数据分析经常出现在我们的日常生活中,各行各业都需要数据分析。可你知道什么是数据分析?它在企业里到底扮演什么角色?以及如果我们自己也想拥有数据分析的能力,以便更好的满足数据分析的需求,我们…

系列六、存储引擎

一、存储引擎介绍 大家可能没有听说过存储引擎,但是一定听过引擎这个词,引擎就是发动机,是一个机器的核心组件。 比如,对于舰载机、直升机、火箭来说,他们都有各自的引擎,是他们最为核心的组件。而我们在选…

vue脚手架多页自动化生成实践

前言 在前端开发过程中,常常面对多种业务场景。到目前为止,前端对于不同场景的处理通常会采用不同的渲染方案来组合处理,常见的渲染方案包括:CSR(Client Side Rendering)、SSR(Server Side Rendering)、SSG(Static Site Generati…

2023年房地产行业研究报告

第一章 行业发展概况 房地产业是指以土地和建筑物为经营对象,从事房地产开发、建设、经营、管理以及维修、装饰和服务的集多种经济活动为一体的综合性产业,是具有先导性、基础性、带动性和风险性的产业。主要包括:土地开发,房屋的…

Vue3 -- PDF展示、添加签名(带笔锋)、导出

文章目录笔锋签名方案一实现要点实现过程组件引用页面元素添加引用实现代码效果展示缺点方案二修改页面元素替换引用修改代码效果展示完整代码地址实现功能的时候采用了两个方案,主要是第一个方案最后的实现效果并不太理想,但实现起来比较简单&#xff0…

JavaScript手写题

一、防抖 function debounce(fn, delay200) {let timeout null; // 定时器控制return function(...args) {if (timeout) { // 定时器存在,表示某个动作之前触发过了clearTimeout(timeout); // 清除定时器timeout null;} else {// 对第一次输入立即执行fn.apply…

【Leetcode 剑指Offer】第 5 天 查找算法(中等)

查找算法剑指 Offer 04. 二维数组中的查找剑指 Offer 11. 旋转数组的最小数字剑指 Offer 50. 第一个只出现一次的字符Python字典基础哈希表(python中是dict())有序哈希表第一个中等,后两个简单题。剑指 Offer 04. 二维数组中的查找 题&#…

Node.js的研究和应用

首先我们要知道什么是node.js? Node.js采用谷歌的V8引擎,是一个服务器端的、非阻断式I/O的、事件驱动的 JavaScript运行环境。 一、Node.js架构具体包含什么呢?咱们从一个图来看看会更加明白。 natives modules: 1.当前层内容由js实现 。…

不使用implements关键字实现实现类(类似于mapper)

首先,说明一下功能需求,平时定义一个接口,就要使用implements关键字来实现接口。那么,当不使用此关键字的时候,是否也能使相关接口也能够绑定实现类呢? 答案是肯定的。 此篇文章的主要功能有两个&#xf…