深入理解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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python刷题】环形链表

问题描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&a…

树网的和 题解

先放一张图 作为一道蓝题&#xff0c;其实快接近紫题了。 --------------------------------------不怎么华丽的分割线-------------------------------------- 前置芝士&#xff1a;树的直径 一个点的最远点( y y y)到这个最远点的最远点( p p p)一定是一条树的直径。 假若…

Winform窗体随着屏幕的DPI缩放,会引起窗体变形及字体变形,superTabControl标签字体大小不匹配

一、前言 superTabControl做的浏览器标签(cefsharp)在缩放比例(125%,150%时字体不协调) 物联网浏览器,定制浏览器,多媒体浏览器(支持H264)参考栏目文章即可 二、配置参数 app.manifest参数 dpiAware =true <application xmlns="urn:schemas-microsoft-c…

Python快速入门系列-1

Python快速入门系列 第一章: Python简介1.1 Python的历史与发展1.2 Python的优势与特点1.2.1 易学易用1.2.2 动态类型1.2.3 丰富的标准库与第三方库1.2.4 面向对象与函数式编程1.2.5 广泛应用领域 1.3 Python的应用领域 第一章: Python简介 1.1 Python的历史与发展 Python是一…

Vue+SpringBoot打造个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

python 蓝桥杯之并查集

文章目录 总述合并过程查找过程算法实战实战1 总述 并查集&#xff08;Disjoint-set Union&#xff0c;简称并查集&#xff09;是一种用来管理元素分组情况的数据结构。它主要用于解决集合的合并与查询问题&#xff0c;通常涉及到以下两种操作&#xff1a; 合并&#xff08;Uni…

优化员工学习体验:企业内训APP的设计与开发方案详解

当下&#xff0c;设计并开发一款高效、便捷、个性化的企业内训APP已成为许多企业追求的目标。本文将探讨如何优化员工学习体验&#xff0c;以及企业内训APP的设计与开发方案。 一、了解员工需求 在设计和开发企业内训APP之前&#xff0c;首先需要深入了解员工的学习需求和偏好…

VSCode搭建ARM开发环境

为了构建Cortex M系列单片机免费开源的开发环境&#xff0c;网络上了解来看VSCODEGCCJLINK是一套比较高效的组合方式&#xff0c;下面记录环境搭建的流程。 我这边的PC环境为 WIN7专业版64bit。 需要用到的工具 Visual Studio CodeSTM32CubemxARM GCC 交叉编译工具链&#x…

“下个月AI觉醒,杀死奥特曼...”好莱坞上线首部AI制作的电影,长达90分钟,取材终结者2

下个月&#xff0c;愚人节&#xff0c;奥特曼危&#xff01; 美国当地时间3月6号&#xff0c;全球首部完全由AI制作的长篇电影《Our T2 Remake》在好莱坞举行首映礼&#xff0c;长达90分钟。 好家伙&#xff0c;“AI制作”&#xff0c;“90分钟”几个关键词一下子就吸引住了小…

安全先行,合规的内外网文件摆渡要重点关注什么?

内外网隔离在政府、军工部门、科研单位等已成为很常见的网络安全建设措施&#xff0c;内外网隔离是一种网络安全措施&#xff0c;用于保护内部网络免受外部网络的攻击和威胁。 内外网隔离的目的在于限制内外网之间的通信和数据交换&#xff0c;但网络隔离后&#xff0c;仍有数据…

CODESYS双通气缸功能块(ST源代码)

博途PLC双通气缸功能块请参考下面文章链接: https://rxxw-control.blog.csdn.net/article/details/136415539https://rxxw-control.blog.csdn.net/article/details/136415539CODESYS 结构变量使用 https://rxxw-control.blog.csdn.net/article/details/126248829

重塑语言智能未来:掌握Transformer,驱动AI与NLP创新实战

Transformer模型 Transformer是自然语言理解(Natural Language Understanding&#xff0c;NLU)的游戏规则改变者&#xff0c;NLU 是自然语言处理(Natural Language Processing&#xff0c;NLP)的一个子集。NLU已成为全球数字经济中AI 的支柱之一。 Transformer 模型标志着AI 新…

landsat遥感卫星地表温度LST计算教程

地表温度反演算法主要有以下三种&#xff1a;大气校正法&#xff08;也称为辐射传输方程&#xff1a;Radiative Transfer Equation——RTE&#xff09;、单通道算法和分裂窗算法。 大气校正法基本原理&#xff1a;首先估计大气对地表热辐射的影响, 然后把这部分大气影响从卫星传…

Android增量报告生成新方案

在开发精准测试覆盖率相关的功能时候&#xff0c;对于Android的增量报告&#xff0c;由于担心修改jacoco插件会影响App的打包&#xff0c;所以一直没有修改。在网上查了一下&#xff0c;没有找到合适的方案。只有一个diff-cover开源项目&#xff1a;https://github.com/abmaonl…

阿里云ECS u1服务器2核4G5M带宽优惠价199元/年性能测评

阿里云服务器ECS u1实例&#xff0c;2核4G&#xff0c;5M固定带宽&#xff0c;80G ESSD Entry盘优惠价格199元一年&#xff0c;性能很不错&#xff0c;CPU采用Intel Xeon Platinum可扩展处理器&#xff0c;购买限制条件为企业客户专享&#xff0c;实名认证信息是企业用户即可&a…

【编程实践】matlab中的转义字符

简记 这个报错是因为在sprintf函数中使用了无效的转义字符\U。在MATLAB中&#xff0c;转义字符\U是无效的&#xff0c;因此会导致警告。 检查sprintf函数中的格式化字符串是否包含了无效的转义字符。确保只使用MATLAB支持的转义字符。 如果想要输出一个反斜杠字符\&#xff0c…

简介:基于 OpenTiny 组件库的 rendereless 无渲染组件架构

在 HAE 自研阶段&#xff0c;我们实现的数据双向绑定、面向对象的 JS 库、配置式开发的注册表等特性&#xff0c;随着前端技术的高速发展现在已经失去存在的意义&#xff0c;但是在 AUI 阶段探索的新思路新架构&#xff0c;经过大量的业务落地验证&#xff0c;再次推动前端领域…

探索Web中的颜色选择:不同取色方法的实现

在Web开发中&#xff0c;提供用户选择颜色的功能是很常见的需求。无论是为了个性化UI主题&#xff0c;还是为了图像编辑工具&#xff0c;一个直观且易用的取色器都是必不可少的。本文将介绍几种在Web应用中实现取色功能的方法&#xff0c;从简单的HTML输入到利用现代API的高级技…

加密与安全_使用Java代码操作RSA算法生成的密钥对

文章目录 Pre概述什么是非对称加密算法&#xff1f;如何工作&#xff1f;示例&#xff1a;RSA算法特点和优势ECC&#xff1a;另一种非对称加密算法 Code生成公钥和私钥私钥加密私钥加密私钥解密 ( 行不通 )私钥加密公钥解密公钥加密和公钥解密 &#xff08;行不通&#xff09;保…

登录校验认证

会话技术 会话&#xff1a;用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求和响应。 会话跟踪&#xff1a; 一种维护浏览器状态的方法&#xff0c;服务器需要识别多次请…