MVCC在MySQL中实现无锁的原理

news/2025/1/24 2:53:23/

一:基础知识

我们知道MySQL是多线程并发处理任务的。MySQL使用了MVCC来实现事务并发的无锁机制。

而且我们还需要知道MySQL的四种隔离级别:读未提交,读已提交(RC),可重复读(RR),串行化。前三种分别对应:脏读,不可重复读,幻读的问题。具体可以看我之前的文章。

我们还需要知道一个叫:undolog的文件。

undolog:通过MVCC记录事务DML操作提交后产生的行数据版本信息。记录DML操作步骤,用于回滚业务,通过逆运算回滚。

redolog:事务提交后,记录DML操作对应物理页修改的内容。

二:MVCC

MVCC基于以下三种结构实现:

1:隐藏列:隐藏列有四个数据:id,数据,事务id,指针。

2:undolog:存储修改数据后的隐藏列。

3:read_view:包含当前事务id,并发事务列表,以及下一个未开始的事务id。

下面举个栗子:

        我们先后开启两个事务,第一个事务修改age这个变量,在修改之前,这个age就已经被修改过两次了,因此在undolog中含有之前的一些数据,并且undolog中存储的数据是以隐藏列的方式进行存储的。当事务一修改之后,我们开启事务二,进行查找这个age操作。此时我们事务二会生成一个readview。

        在这个readview中,我们含有一些数据:当前的事务id,事务id列表,下一个事务id。当我们获得这个readview后,我们会使用这个在undolog中进行查找。查找分为三种判断:首先是否是自己这个事务修改的,是的话,直接拿取,不是那就沿着指针向下查找。其次如果这个事务id,大于我们最大的事务id,那我们也直接跳过,因为他是在我们开启这个事务之后才开启的。最后我们判断是否小于并发中的最小事务id,也就是,我们开启事务之前,已经修改好的数据,那我们就可以使用。

下面是一个图解,比较好理解。

三:RC和RR的区别

        他俩的区别就是:不可重复读的一个问题。在RR中解决了这个问题。其实这个区别也比较简单:RC中是每一次select都会产生一个新的readview,而RR是事务开启后产生一个readview,然后用到事务提交。

        这样我们可以拿上面那个图在进行一下对比。比如RR其实就是上面的那幅图,即使在4的位置又进行了一次查询,那还是使用右边这个readview,没有任何变化,因此读取到的数据是一样的,那就解决了不可重复读的问题了。

        但是我们把上面那幅图给换成RC的隔离级别的话,那在4的位置会产生一个新的readview,这个时候,我们看到事务一已经提交了,因此我们这个readview会改变,并发事务列表中就只剩下自己的20了,这个时候,我们通过readview读取undolog,会发现第一条最新的数据小于我们最小的事务id,因此这条数据就可以拿取到,所以我们在一个事务中会读取到不同的数据,这就是不可重复读。

对于读未提交来说,他是一个既不使用锁,也不使用MVCC的一个隔离级别

读已提交:是每一次查询就建立一个readview。

可重复读:事务开启后,创建一个readview,一直用到事务提交后。

串行化:全部加锁。

 0voice · GitHub


http://www.ppmy.cn/news/1565661.html

相关文章

21. C语言 `typedef`:类型重命名

本章目录: 前言1. 什么是 typedef?语法示例:基本类型的别名 2. typedef 为结构体定义别名示例:为结构体定义别名 3. typedef vs #define:两者的区别(1) **作用范围和处理方式**(2) **类型别名的处理**(3) **多个变量的声明**(4) *…

工程上LabVIEW常用的控制算法有哪些

在工程应用中,LabVIEW常用的控制算法有很多,它们广泛应用于自动化、过程控制、机器人、测试测量等领域。以下是一些常见的控制算法: 1. PID 控制 用途:PID(比例-积分-微分)控制是最常用的反馈控制算法&…

Docker核心命令与Yocto项目的高效应用

随着软件开发逐渐向分布式和容器化方向演进,Docker 已成为主流的容器化技术之一。它通过标准化的环境配置、资源隔离和高效的部署流程,大幅提高了开发和构建效率。Yocto 项目作为嵌入式 Linux 系统构建工具,与 Docker 的结合进一步增强了开发…

初学stm32 --- CAN

目录 CAN介绍 CAN总线拓扑图 CAN总线特点 CAN应用场景 CAN物理层 CAN收发器芯片介绍 CAN协议层 数据帧介绍 CAN位时序介绍 数据同步过程 硬件同步 再同步 CAN总线仲裁 STM32 CAN控制器介绍 CAN控制器模式 CAN控制器模式 CAN控制器框图 发送处理 接收处理 接收过…

Linux初识:【Linux软件包管理器yum】【Linux编辑器-vim的使用】【Linux编译器-gcc/g++的使用】

目录 一.Linux软件包管理器yum 什么是软件包 查看软件包 卸载 怎么知道下载路径? 二.Linux编辑器-vim的使用 2.1vim的基本概念 2.2vim的基本操作 gg(快速回到第一行的最开始) 移动光标的其他快捷方式 2.3vim正常模式命令集 插入…

青少年CTF练习平台 PHP的XXE

访问靶场是个phpinfo()页面 题目提示是PHP的XXE&#xff0c;访问simplexml_load_string.php文件 get请求是空白&#xff0c;要使用post方法请求 尝试读取文件,读取/etc/passwd文件 <?xml version"1.0" encoding"utf-8" ?> <!DOCTYPE xxe [ &l…

基于深度学习的视觉检测小项目(十五) 用户的登录界面

用户管理离不开的是消息框&#xff08;QMessageBox&#xff09;和对话框&#xff08;QDialog&#xff09;&#xff0c;比如对话框用于用户名和密码输入&#xff0c;消息框用于提示登录成功、密码错误。 • 基础知识&#xff1a;PySide6&#xff08;PyQT5&#xff09;的常用对话…

PHP语言的网络编程

PHP语言的网络编程 网络编程是现代软件开发中不可或缺的一部分&#xff0c;尤其是在日益发展的互联网时代。PHP&#xff08;Hypertext Preprocessor&#xff09;是一种广泛使用的开源脚本语言&#xff0c;专门用于Web开发。它的灵活性、易用性以及强大的社区支持使得PHP在网络…