深入理解MySQL中的MVCC(多版本并发控制)

在MySQL中,MVCC是一种用于提供并发控制的技术,它允许数据库系统在事务并发执行的情况下保持数据的一致性,同时提高了数据库的并发性能。MVCC背后的理念是允许每个事务可以看到一个一致性的快照,从而避免了读取操作被写入操作所阻塞的情况。不用加锁,解决多并发场景下的快照读问题

1 MVCC的原理

MVCC的核心思想是为每个数据行保存其在不同时间点的版本,并通过版本号或时间戳来标识这些版本。当一个事务开始时,MySQL会为该事务创建一个独立的事务ID,并利用这个ID去获取数据的一致性快照。

  • Undo日志:在MySQL中,MVCC的实现依赖于undo日志(也称为回滚日志)。当某个事务对数据进行修改时,MySQL不会立即覆盖原始数据,而是将修改前的原始数据保存到undo日志中。这样,其他事务仍然可以访问到这个数据的旧版本,从而实现了数据的多版本管理。
  • ReadView:每个事务在启动时都会创建一个ReadView,这个视图通过检查undo日志中的信息和事务的时间戳来确定哪些数据版本对于当前事务是可见的。这样,对于已提交的数据版本,ReadView会返回最新的版本,对于未提交的数据版本,ReadView则会返回旧的版本或者忽略这些数据。

2 当前读和快照读

2.1 当前读

查询当前已提交最新的数据

  • SELECT LOCK IN SHARE MODE;(共享锁)
  • SELECT FOR UPDATE;(排它锁)
  • UPDATE(排它锁)
  • DELETE(排它锁)
  • INSERT(排它锁)
  • 串行化事务隔离级别

2.2 快照读

普通的select查询,通过MVCC进行版本链查找就叫快照读

3 版本链

3.1 什么是版本链

首先聚簇索引的叶子节点存储数据包括两个隐藏字段:trx_id(事务ID)、roll_pointer(回滚指针)

  • trx_id(事务ID):记录的是修改当前这行数据的事务ID
  • roll_pointer(回滚指针):记录该行数据上个版本的地址

因此版本链其实就是由回滚指针(roll_pointer)串起来的该行数据对应的各个版本。
在这里插入图片描述

3.2 read view

MySQL中的Read View(读视图)是多版本并发控制(MVCC)机制的一部分。在多用户并发访问数据库时,read view 能够确保每个用户看到的数据都是一致的,避免了脏读、不可重复读等问题。

read view中四个核心参数:

  • m_ids:当前活跃事务ID列表
  • min_trx_id:活跃事务最小ID
  • max_trx_id:下一个事务ID
  • creator_trx_id:当前事务ID

在这里插入图片描述
如何判断版本链中可用版本:
在这里插入图片描述

4 MVCC在读已提交和可重复读下区别

根本原因在于RC隔离级别下事务中每次select都会创建一个read view,而RR隔离级别只会在事务中创建一次read view

4.1 读已提交场景

简单理解:读取已提交最新的数据,能解决脏读,有不可重复度问题。

根本原因:读已提交事务隔离级别下,事务里面每次select查询都会创建一个read view。

举例说明:事务A 进行一次修改,事务B进行两次查询

  1. 首先开启A事务并修改为‘北冥-2’,事务未提交。(修改前查询最新数据时会生成read view)
  2. 然后开启事务B进行select查询,此时查询到的数据为‘北冥’,read view 如下
  3. 事务A提交事务。数据被提交到磁盘。
  4. 事务B再次相同select查询,read view如下,此时min_trx_id变成了2,当判断trx_id < min_trx_id满足条件,所以获取到最新数据,和之前数据不一致。因此不可重复度。

在这里插入图片描述

4.2 可重复读场景

简单理解:读取已提交最新的数据,能解决脏读,有不可重复度问题。

根本原因:可重复读事务隔离级别下,每个事务只会创建一个read view,同一个事务里面的select操作共用同一个read view。

举例说明:事务A 进行一次修改,事务B进行两次查询

  1. 首先开启A事务并修改为‘北冥-2’,事务未提交。(修改前查询最新数据时会生成read view)
  2. 然后开启事务B进行select查询,此时生成read view,根据版本链查询到的数据为‘北冥’

在这里插入图片描述
3. 即便后面事务A已经提交了事务,最新数据被更改为了‘北冥-2’,但是事务B的read view 还是之前那个,在根据上面条件进行判断时最新数据中trx_id=2不符合,根据回滚指针找到下一条数据trx_id=1才符合,因此读到的数据跟第一次是一样的。
在这里插入图片描述

mysql解决了幻读吗?
只解决了快照读下的幻读,而当前读需要通过间隙锁

RC隔离级别下有间隙锁吗?
没有,

参考
B站 IT老哥 :阿里P7要求这么低吗?老哥给你讲清楚什么是MySQL的MVCC

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

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

相关文章

Python算法题集_搜索二维矩阵

Python算法题集_搜索二维矩阵 题74&#xff1a;搜索二维矩阵1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【矩阵展开为列表二分法】2) 改进版一【行*列区间二分法】3) 改进版二【第三方模块】 4. 最优算法5. 相关资源 本文为Python算法题集之…

c++中string的使用!!!(适合初学者 浅显易懂)

我们先初步的认识一下string,string底层其实是一个模版类 typedef basic_string<char> string; 我们先大致的把string的成员函数列举出来 class string { private: char * str; size_t size; size_t capacity; }; 1.string的六大默认函数 1.1 构造函数、拷贝构造 注&am…

基础刷题50之四(有效的字母异位词)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、题目二、力扣官方题解1、排序2、哈希表 三、文心一言解释1、排序2、哈希表 总结 前言 刚上研一&#xff0c;有人劝我好好学C&#xff0c;当时用的不多就没…

动态规划(算法竞赛、蓝桥杯)--数位DP--Windy树

1、B站视频链接&#xff1a;E37 数位DP Windy数_哔哩哔哩_bilibili 题目链接&#xff1a;[SCOI2009] windy 数 - 洛谷 #include <bits/stdc.h> using namespace std; const int N 12; int a[N]; //把整数的每一位数字抠出来&#xff0c;存入数组 int f[N][10]; /…

代码随想录算法训练营第36天—动态规划04 | ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

01背包 https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1cg411g7Y6 常见的背包问题类型&#xff08;大厂面试重点掌握01背包和完全背包即可&#xf…

LeetCode-1944题: 队列中可以看到的人数(原创)

【题目描述】 有 n 个人排成一个队列&#xff0c;从左到右 编号为 0 到 n - 1 。给你以一个整数数组 heights &#xff0c;每个整数 互不相同&#xff0c;heights[i] 表示第 i 个人的高度。一个人能 看到 他右边另一个人的条件是这两人之间的所有人都比他们两人 矮 。更正式的&…

能量不等式证明

波动方程初值问题能量不等式的证明 Gronwall 不等式 若非负函数 G ( τ ) G(\tau) G(τ) 在 [ 0 , T ] [0,T] [0,T] 上连续可微&#xff0c; G ( 0 ) 0 G(0)0 G(0)0&#xff0c;且对 τ ∈ [ 0 , T ] \tau\in[0,T] τ∈[0,T]满足 d G ( τ ) d τ ≤ C G ( τ ) F ( τ …

Flutter图片内存占用过大问题

图片(Image)加载原理&#xff1a; Image &#xff1a; 显示图⽚的Widget&#xff0c;通过ImageState管理ImageProvider的⽣命周期。 ImageProvider&#xff1a; 图⽚的抽象概念。 根据Image创建实例时调用的工厂方法的不同&#xff08;Image.network或者Image.assetImage&#…

【FPGA/IC】CRC电路的Verilog实现

前言 在通信过程中由于存在各种各样的干扰因素&#xff0c;可能会导致发送的信息与接收的信息不一致&#xff0c;比如发送数据为 1010_1010&#xff0c;传输过程中由于某些干扰&#xff0c;导致接收方接收的数据却成了0110_1010。为了保证数据传输的正确性&#xff0c;工程师们…

禁止使用搜索引擎,你了解吗?

员工A&#xff1a;“我今天想搜索的时候&#xff0c;用不了浏览器了&#xff0c;你能用么&#xff1f;” 员工B&#xff1a;“不知道啊我试一下啊” “也不行” 员工C&#xff1a;“为什么啊&#xff1f;” 针对上述对话&#xff0c;我们不禁思考&#xff1a; 公司为什么禁…

python基础9_序列类型

回顾: 什么是变量?,有什么用? 可以变化的量, 就是个容器,多次变化,方便后续使用, 前面介绍了哪些数据类型? bool, str, int, float 用什么函数查看数据的类型? a "hello" print(type(a)) 到了这一步,,我们认识了哪些数据类型呢? int 整型(整数), float…

office下常见问题总结——(持续更新学习记录中......)

目录 Wordword2019中, 当给选定的汉字设置格式后&#xff0c;其他相同汉字也会自动应用相同的格式?在Word中&#xff0c;当输入数字后加上句点&#xff08;.&#xff09;时会自动被识别为标题,如何关闭功能?如何让当前的word中的样式 ,匹配全局模版中的样式?在word中,为什么…

一、NLP中的文本分类

目录 1.0 文本分类的应用场景 1.1 文本分类流程 ​编辑 1.2 判别式模型 1.3 生成式模型 1.4 评估 1.5 参考文献 1.0 文本分类的应用场景 &#xff08;1&#xff09;情感分析&#xff1a;中性&#xff0c;正向评论&#xff0c;负向评论&#xff0c;黄色言论&#xff0c;暴…

Java基础 - 8 - 算法、正则表达式、异常

一. 算法 什么是算法&#xff1f; 解决某个实际问题的过程和方法 学习算法的技巧&#xff1f; 先搞清楚算法的流程&#xff0c;再直接去推敲如何写算法 1.1 排序算法 1.1.1 冒泡排序 每次从数组中找出最大值放在数组的后面去 public class demo {public static void main(S…

Matlab偏微分方程拟合 | 完整源码 | 视频教程

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法&#xff0c;并提供所有案例完整源码&#xff1b;2.…

力扣hot100题解(python版63-68题)

63、搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输…

【npm】前端工程项目配置文件package.json详解

简言 详细介绍了package.json中每个字段的作用。 package.json 本文档将为您介绍 package.json 文件的所有要求。它必须是实际的 JSON&#xff0c;而不仅仅是 JavaScript 对象文字。 如果你要发布你的项目&#xff0c;这是一个特别重要的文件&#xff0c;其中name和version是…

王升:Audio电感对车载功放EMC的影响 | 演讲嘉宾公布

一、智能车载音频 II 专题论坛 智能车载音频 II 专题论坛将于3月28日同期举办&#xff01; 我们正站在一个前所未有的科技革新的交汇点上&#xff0c;重塑我们出行体验的变革正在悄然发生。当人工智能的磅礴力量与车载音频相交融&#xff0c;智慧、便捷与未来的探索之旅正式扬帆…

若依/RuoYi-Vue使用docker-compose部署

系统需求 JDK > 1.8 MySQL > 5.7 Maven > 3.0 Node > 12 Redis > 3 思路 前端服务器 nginx 后端服务器代码打包 java、maven、node 数据库/缓存 mysql、redis 开始 创建目录ruoyi并进入 克隆若依代码 git clone RuoYi-Vue: &#x1f389; 基于Spring…

试用期自我总结报告10篇

试用期自我总结报告&#xff08;篇1&#xff09; 一转眼试用期的时间飞快就过去了&#xff0c;在这段时间里我学习到了很多&#xff0c;也把自己在过去学习的东西得已融会贯通。能够来到幼儿园里成为一名老师是我一直以来的目标&#xff0c;而我也终于完成了自己的目标&#x…