【MySQL】MVCC机制

引入问题

首先看下面这张图,假如说一条数据经过了事务 2、3、4,到事务 5 的时候,进行两次查询,那这两次查询分别查询的是哪个事务版本的记录呢?

在这里插入图片描述

这就是我们要解决的问题,那么MVCC机制也就是为了解决这个问题。

具体实现

MVCC 主要依赖三个内容,分别为:隐藏字段undo log 版本链readView

隐藏字段

其实在我们存储数据库中一条数据的时候,并不单单是存储我们看到的那些数据,还会存储一些隐藏字段:最近修改的事务ID、回滚指针roll_pointer等。真实存储如下图所示:
在这里插入图片描述

undo log 版本链

介绍undo log之前,可以先了解一下undo log。

undo log就是回滚日志,我们之前讲到过,在插入、更新、删除的时候会产生便于数据回滚的日志。但是当插入的时候,产生的日志只要在事务提交之后就会立即删除,而更新和删除的时候,产生的日志并不会立即删除的。不仅回滚时需要,MVCC 版本访问的时候也是需要的。

undo log版本链就是把每次修改的undo log以链表形式记录下来,生成的一条版本链表。

在这里插入图片描述

readView

readView 是快照读 SQL 执行时 MVCC 提取数据的依据,记录并维护当前活跃的(未提交的)事务 ID。readView 中有四个字段:

在这里插入图片描述

第一个字段:假如说事务 5 第一次查询,那么当前活跃的事务 ID 就是 3,4,5
第二个字段:最小活跃事务 ID 那就是 3
第三个字段:最大事务是 5,所以预分配事务 id 就是 6
第四个字段:创建者事务 id 就是 5
有了上面那些字段之后呢,为了获取准确的数据,readView 定义了一些数据返回的规则,规则如下:

在这里插入图片描述

有了这些规则之后,我们就可以根据规则来选择合适的版本数据。除此之外,我们需要知道不同隔离级别下,生成的读视图(readView )时机是不同的。

例如 RC 在事务中每一次执行快照读生成readView;RR 仅在事务第一次执行快照读生成readView,后续复用上面的readView

下面简单举例,RC 级别下生成的 readView:

在这里插入图片描述

再结合规则我们来进行判断看选择哪一次 undo log 链中的事务来进行读:

在这里插入图片描述

比如第一个 4 来进行判断,① 条件不满足,② 条件不满足,③ 条件不满足,④ 条件也不满足,所以说事务 4 是不选择的
接着 3,①,② ,③ ,④ 条件也都不满足,所以事务 3 不选择
看事务 2,① 条件不满足,但是② 就满足了,也满足 ④,所以读的就是事务 2 中的数据
因为是 RC 级别下,所以第二次查询又生成了一个 readView,根据上面规则,很容易就能选择到事务 3 满足条件

RR 级别下生成 readView:
在这里插入图片描述

总结

MVCC 机制主要是包括三大部分:隐藏字段undo log 版本链readView

我们存储的数据会默认也存储两个隐藏字段,分别为当前修改的事务 id 和 roll_pointer 回滚指针

undo log 是回滚日志,存储老版本的数据。多个事务操作某一行数据,记录不同事务修改数据的版本,通过回滚指针形成的链表叫做 undo log 版本链

readView 解决了事务查询选择版本的问题,根据 readView 的匹配规则和当前事务 id 判断该访问哪个版本的数据。不同隔离级别 readView 是不一样的,最终访问结果也是不同的。比如 RC,每一次执行快照读生成 readView,RR 仅在事务第一次执行快照读时生成 readView,后续复用

参考链接

https://www.bilibili.com/video/BV1yT411H7YK?p=32&vd_source=8e7bfe48e222037c101ebbfa23645009

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

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

相关文章

力扣hot100题解(python版29-32题)

29、删除链表的倒数第N个结点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出&a…

金三银四,自动化测试面试题精选【美团二面】

面试一般分为技术面和hr面,形式的话很少有群面,少部分企业可能会有一个交叉面,不过总的来说,技术面基本就是考察你的专业技术水平的,hr面的话主要是看这个人的综合素质以及家庭情况符不符合公司要求,一般来…

Decision Transformer

DT个人理解 emmm, 这里的Transformer 就和最近接触到的whisper一样,比起传统Transformer,自己还设计了针对特殊情况的tokens。比如whisper里对SOT,起始时间,语言种类等都指定了特殊tokens去做Decoder的输入和输出。 DT这里的作为输入的Tokens由RL里喜闻乐见的历史数据:…

安秉源代码加密,不仅可以正常加密,对编译调试无任何影响

源代码防泄密对于很多企业来讲都在使用,特别是在广东一些做智能制造的企业,这些企业在很早就意识到源代码防泄密的重要性,很多企业采用加密的方式对企业的源代码进行加密,也采用了相对应的加密软件,但是在使用一些加密…

nodejs配置环境变量后不生效(‘node‘ 不是内部或外部命令,也不是可运行的程序或批处理文件)

一、在我们安装Node.js后,有时候会遇到node命令不管用的情况,关键是在安装时候已经添加配置了环境变量,向下面这样 但是还是不管用,这是因为环境变量配置不正确,权重不够,或者是命令冲突导致,解…

存内计算技术大幅提升机器学习算法的性能—挑战与解决方案探讨

一.存内计算技术大幅机器学习算法的性能 1.1背景 人工智能技术的迅速发展使人工智能芯片成为备受关注的关键组成部分。在人工智能的构建中,算力是三个支柱之一,包括数据、算法和算力。目前,人工智能芯片的发展主要集中在两个方向&#xff1…

nginx使用详解--缓存使用

Nginx 是一个功能强大的 Web 服务器和反向代理服务器,它可以用于实现静态内容的缓存,缓存可以分为客户端缓存和服务端缓存。 客户端缓存 客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个协商缓存的请…

【程序员的金三银四求职宝典】《春风拂面,代码在手:程序员的金三银四求职指南》

《春风拂面,代码在手:程序员的金三银四求职指南》 随着春风的轻拂,大地复苏,万物更新。在这个生机勃勃的季节,不仅自然界在迎接新生,对于广大的程序员朋友们而言,这也是一个全新的开始——金三…

数据库JSON类型到映射JAVA上

Mysql存放JSON数据如何映射JAVA实体类 概述:最近写在写SKU模块中,需要表中字段存放JSON类型数据,mybatis-plus在查询的时候如何跟JSON类型所匹配呢?再次记录一下。 直接上代码,后面有解释到底如何映射上的。 Mysql表…

推荐几款优秀免费开源的导航网站

🦩van-nav 项目地址:van-nav项目介绍:一个轻量导航站,汇总你的所有服务。项目亮点:全平台支持,单文件部署,有配套浏览器插件。效果预览 🦩发现导航 项目地址:nav项目…

Spring Cloud2022之OpenFeign使用以及部分源码分析

OpenFeign使用 Feign和OpenFeign Feign是Netflix开发的⼀个轻量级RESTful的HTTP服务客户端,可以使用⽤它来发起请求,进行远程调用。Fegin是以Java接口注解的⽅式调⽤Http请求,而不是像RestTemplate那样,在Java中通过封装HTTP请求…

android开发技术论文,Android中为什么需要Handler

前言 马爸爸总结了一句话:跳槽,要么是钱不到位,要么是受了委屈。 我给自己这次的跳槽经历做了一个分析,希望能对那些想换工作的朋友有所帮助。 许多朋友想换工作,但是对“换工作”的理解可能仅限于写简历、投简历、…