MYSQL隔离性原理——MVCC

表的隐藏字段

表的列包含用户自定义的列和由系统自动创建的隐藏字段。我们介绍3个隐藏字段,不理解也没有关系,理解后面的undo log就懂了:

  • DB_TRX_ID 6 byte,最近修改( 修改/插入 )事务ID,记录创建这条记录/最后一次修改该记录的事务ID
  • DB_ROLL_PTR : 7 byte,回滚指针,指向这条记录的上一个版本(简单理解成,指向历史版本就行,这些数据一般在 undo log 中)
  • DB_ROW_ID : 6 byte,隐含的自增ID(隐藏主键),如果数据表没有主键, InnoDB 会自动以DB_ROW_ID 产生一个聚簇索引

undo log

undo log是一个缓冲区,用来存放记录修改的历史记录。

以下面这个表为例讲解:

 当我们插入一条记录后,这个表中的内容实际上是这样的:

idnameDB_TRX_IDDB_ROLL_PTR...
1Tom创建当前记录的事务id,假设为1null

如果我们在一个事务中修改这个记录,它的过程是这样的:

先将当前记录做备份,放到undo log中。同时将修改后的记录的DB_ROLL_PTR设置为上一个记录的地址。就这样将记录的每个版本都用回滚指针连起来,形成一个版本控制链。当我们想要回滚到某个版本时,就可以直接找到。这一个个版本,我们称之为快照。

另外,不需要考虑undo log满的情况。在一个事务commit之后,修改记录的所有版本都会释放。

 ReadView

undo log看起来和隔离性没什么关系,其实不然。隔离性是由undo log和readview配合实现的!

先介绍连个两个概念:

当前读:读取最新的记录,就是当前读。增删改,都叫做当前读。

快照读:读取记录的历史版本(一般而言),就叫做快照读。


Readview是一个类,可以记录数据库当前活跃事务的id,以及事务id的分配情况,相当于当前数据库的一个快照。我们简单了解几个类成员:

  • m_ids; //一张列表,用来记录Read View生成时,系统正进行的事务的ID
  • up_limit_id; //记录m_ids列表中事务ID最小的ID,小于这个值的事务id,就说明这个事务已经commit了。
  • low_limit_id; //ReadView生成时刻系统尚未分配的下一个事务ID,也就是目前已出现过的事务ID的最大值+1。大于这个id值的事务,就是在Read View生成后新开始的事务。
  • creator_trx_id //创建该ReadView的事务ID

隔离性的实现

ReadView会在事务进行快照读的时候创建,此时,事务会被分成三类:


对于read uncommitted,这三类事务的记录快照对于当前进行的事务来讲全部可见。

对于read committed和repeatable read,在第一个区间的事务id的记录快照可见;在第二个区间内但是不在m_ids中的事务的记录快照也可见,但是在m_ids中的事务的记录快照不可见;在第三个区间的事务的记录快照不可见。

那么,RC和RR的区别在哪?

对于RC,当前事务每次进行快照读的时候,都会创建ReadView。因此,当并行事务commit后,再进行快照读,这条记录就会变得可见。

对于RR,只在事务第一次进行快照读时创建ReadView,后续不会再创建。因此,不管并行的事务是否commit,都无法看到修改后的记录。

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

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

相关文章

strtok函数详解

strtok函数 strtok 函数是一个字符串分割函数,用于将字符串分割成一系列的标记。这个函数通过一组分隔符字符来确定标记的边界,每次调用都会返回字符串中的下一个标记,并且将原始字符串中的分隔符替换为空字符‘\0’,从而实际上是…

NewStar CTF 2024 misc WP

decompress 压缩包套娃,一直解到最后一层,将文件提取出来 提示给出了一个正则,按照正则爆破密码,一共五位,第四位是数字 ^([a-z]){3}\d[a-z]$ 一共就五位数,直接ARCHPR爆破,得到密码 xtr4m&…

Git介绍以及SSH配置

目录 1. Git介绍 1.1 Git的基本原理 1.2 Git的主要功能 1.3 Git的优点 1.4 Git的缺点 2. Git安装 3. SSH配置 1. Git介绍 Git是一款功能强大的分布式版本控制系统,最初由Linux操作系统的开发者Linus Torvalds在2005年开发,用于管理Linux内核的源代…

gtfToGenePred如何下载

gtfToGenePred 是 UCSC 提供的一款工具,用于将 GTF(Gene Transfer Format)文件转换为 GenePred 格式的基因注释文件。由于不同的生物信息学分析工具对基因注释文件的格式要求不同,gtfToGenePred 的主要作用就是让 GTF 文件能够兼容…

PH热榜 | 2024-11-09

DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论、搜索等功能,欢迎大家体验。 在线预览 1. Shootmail 标语:像Notion一样,可以创建漂亮邮件模板和邮件内容的工具。 介绍:想象一下…

大数据机器学习算法与计算机视觉应用03:数据流

Data Stream Streaming ModelExample Streaming QuestionsHeavy HittersAlgorithm 1: For Majority elementMisra Gries AlgorithmApplicationsApproximation of count Streaming Model 数据流模型 数据流就是所有的数据先后到达,而不是同时存储在内存之中。在现…

嵌入式学习第21天Linux基础

目录 第1章 Linux 系统介绍 1.1 Unix 操作系统(了解) 1.2 Linux 操作系统(了解) 1.3 Linux 操作系统的主要特性(重点) 1.4 Linux 与 Unix 的区别与联系 1.5 GUN 与 GPL(了解) …

【数学二】线性代数-线性方程组-齐次线性方程组、非齐次线性方程组

考试要求 1、会用克拉默法则. 2、理解齐次线性方程组有非零解的充分必要条件及非齐次线性方程组有解的充分必要条件. 3、理解齐次线性方程组的基础解系及通解的概念,掌握齐次线性方程组基础解系和通解的求法. 4、理解非齐次线性方程组的解的结构及通解的概念. 5、会用初等行变…

【小程序安全】小程序反编译

❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 0x01 前期准备 知识点准备-小程序结构 1.主体结构 小程序包含一个描述整体程序的 app 和多个描述各自页…

Vue 状态管理工具vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式和库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 解决了多个组件共享状态时,状态的可维护性和可预测性问题。 Vuex 的核心概念 State&…

C++ : STL容器(适配器)之stack、queue剖析

STL容器适配器之stack、queue剖析 一、stack、queue的接口(一)stack 接口说明(二)queue 接口说明 二、stack、queue的模拟实现(一)stack、queue是容器适配器stack、queue底层默认容器--deque1、deque概念及…

React官网生成Recat项目的区别

1. Next.js 特点: 页面级路由:使用文件系统路由,基于 /pages 文件夹的结构自动创建 URL 路径。渲染模式:支持三种渲染模式:静态生成 (SSG)、服务器端渲染 (SSR) 和客户端渲染 (CSR),并允许根据页面的具体需…

Kubernetes的基本构建块和最小可调度单元pod-0

文章目录 一,什么是pod1.1pod在k8s中使用方法(1)使用方法一(2)使用方法二 1.2pod中容器的进程1.3pod的网络隔离管理(1)pause容器的作用 1.4 Pod分类:(1)自主式…

【CUDA】认识CUDA

目录 一、CUDA编程 二、第一个CUDA程序 三、CUDA关键字 四、device管理 4.1 初始化 4.2 Runtime API查询GPU信息 4.3 决定最佳GPU CUDA C 编程指南CUDA C在线文档:CUDA C 编程指南 CUDA是并行计算的平台和类C编程模型,能很容易的实现并行算法。只…

AtomicInteger 和 AtomicIntegerFieldUpdater的区别

AtomicInteger 和 AtomicIntegerFieldUpdater 都是 Java 并发库中用于处理原子操作的类。 1. AtomicInteger 定义: AtomicInteger 是一个原子类,它封装了一个 int 值,并提供了对该值进行原子操作的方法。使用场景: 适用于需要对单个整数值进行原子操作…

知识中台如何在精简供应链管理中发挥作用?

您如何与供应商沟通并分享您的最佳实践?您如何确保供应商了解您的基准?如果您正在为这些问题烦恼,请不要担心,本文章将为您提供宝贵的见解。 构建具备弹性的供应链模型,其关键在于知识中台的数据质量。若缺乏数据支撑…

Python 在PDF中绘制形状(线条、矩形、椭圆形等)

在PDF中绘制图形可以增强文档的视觉效果。通过添加不同类型的形状,如实线、虚线、矩形、圆形等,可以使文档更加生动有趣,提高读者的阅读兴趣。这对于制作报告、演示文稿或是教材特别有用。本文将通过以下几个示例介绍如何使用Python 在PDF中绘…

Gitlab-执行器为Kubetnetes时的注意事项,解决DNS解析问题

一、Gitlab-Runner 这里对于Runner的理解非常重要。 具体执行ci流水线的叫执行器。执行器可以部署是shell、docker、k8s的pod.执行完任务则生命周期结束。 管理执行器的叫Gitlab-Runner。Runner则是与Gitlab Server的Ci agent.(可以简单这么理解) 二、执行器为Kubetnetes时,DN…

20241108,LeetCode 每日一题,用 Go 计算字符串中最长无重复字符

题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “…

hudi写时复制与读时合并

COPY_ON_WRITE 是 Apache Hudi 中的一种表存储模式,指的是 写入数据时复制(写时复制) 的策略。具体来说,它描述了在更新、插入或删除数据时的存储方式和行为。 详细解释: Hudi 目前提供两种主要的存储类型&#xff1…