Mysql系列三:Innodb MVCC版本控制

news2025/1/16 0:58:20

文章目录

  • 一、Innodb MVCC版本控制
    • 1、什么是MVCC版本控制?
    • 2、Innodb MVCC 核心
    • 3、事物版本号、隐藏列、undo log日志的协调工作机制
    • 4、Read view
    • 5、举例讲解MVCC流程
    • 6、InnoDB 引擎不同隔离级别MVCC的区别
    • 7、MVCC是否解决了幻读的问题


一、Innodb MVCC版本控制

1、什么是MVCC版本控制?

MVCC是在并发访问那数据库时,通过对数据版本的控制,避免使用加锁从而造成读取阻塞的情况,比如某个事物进行写操作之后,依然可以读取旧版本的数据,这就是MVCC。

2、Innodb MVCC 核心

  • 事务版本号 :

每次开启事务都会有一个唯一id,该id是递增的,可以从id的大小来观察事物开启的顺序。

  • 表的隐藏列:
DB_TRX_ID记录操作该数据事务的事务ID;
DB_ROLL_PTR指向上一个版本数据在undo log 里的位置指针;
DB_ROW_ID隐藏ID ,当创建表没有合适的索引作为聚集索引时,会用该隐藏ID创建聚集索引;
  • undo log :

回滚日志,记录了事物修改之前的数据信息,当事物回滚时候,通过undo log日志回滚数据。

用途:

​ 1、保证事物rollback时的原子性和一致性,当事物回滚时候,从undo log日志进行恢复。

​ 2、在MVCC快照读取时,通过读取undo log日志读取历史数据,以此避免了使用锁从而造成阻塞的问题。

  • read view :
trx_ids: 当前系统活跃(未提交)事务版本号集合。
low_limit_id: 创建当前read view 时“当前系统最大事务版本号+1”所以若数据的事物id大于该值,一定在当前事物开启之后提交的。
up_limit_id: 创建当前read view 时“系统正处于活跃事务最小版本号”,所以若数据的事物id小于该值,一定在当前事物开启之前就已经提交了。
creator_trx_id: 创建当前read view的事务版本号;

3、事物版本号、隐藏列、undo log日志的协调工作机制

假设 user表数据如下所示:

user表

开启事物,修改数据

update user set name = '哈哈哈' where id = 1;
  • 首先获得一个事物id编号DB_TRX_ID为100
  • 修改user表之前的数据复制到undo log日志中。
  • 修改user表的数据name为哈哈哈
  • 将此时数据的版本号改成当前事务版本号100,把DB_ROLL_PTR作为指向undo log日志的指针,以此找到修改前的数据。

最后大致如下所示会形成一个版本链:

undo log

4、Read view

在innodb引擎中,每次开启事物都会获得一个read view,内部主要包含了此时活跃事物的信息,以及活跃与非活跃临界值的事物ID,如下所示:

  • trx_ids: 系统中活跃事物版本号的集合。
  • low_limit_id : 创建当前的read view时 当前事物版本号的最大值+1。
  • up_limit_id: 创建当前的read view时,活跃事物版本号的最小值。
  • creator_trx_id: 创建当前read view的事务版本号。

在读取时,有一下几种情况:

数据的事物id 简称 dataId

1、dataId > low_limit_id,则无法显示

如果事物id比创建read view内的最大事物版本号+1还要大,说明该数据在当前事物开启之后修改的,则无法访问,需要去undo log日志中寻找符合的数据。

2、dataId < up_limit_id,则显示

如果事物id比创建read view内的最小活跃事物还要小,说明该数据在开启当前事物之前就已经提交了,可以直接读取。

3、up_limit_id <= dataId <= low_limit_id,则观察 trx_ids 集合。

  • 查看是否存在该数据的事物版本号,若存在说明操作该条数据的事物还未提交,则无法显示。
  • 若不存在,说明操作该数据的事物已经提交了或就是当前事物操作的,则可以显示。

以上所有无法显示的情况,都会通过指针去undo log日志中找到前一次的数据,再次通过上述判断是否可以显示,以此递归直到返回数据或返回空。

5、举例讲解MVCC流程

MVCC执行流程

如上所示:

开启事务A:执行SQL,获得事物id为100

update user set name ='张三' where id = 3;

开启事务B:执行SQL,获得事物id为101

select * from user where id = 3;

事物B会生成read view。

  • trx_ids: [100]
  • low_limit_id : 102
  • up_limit_id: 100
  • creator_trx_id: 101

然后拿着id为3的数据去与read view进行条件判断:

1、首先判断100是否比low_limit_id大,若成立不显示,反之继续判断。
2、判断100是否比up_limit_id小,若小可以显示,反之继续判断。
3、判断100是否在trx_ids集合内,若在集合内,不显示;反之说明事物已经提交,则显示

判断之后发现,结果为不显示,则去undo log里面获取修改前的数据,再次判断,若满足显示则返回,若不满足则继续找寻前一条数据,继续判断。

这儿最终返回的是事物id为99的数据。

6、InnoDB 引擎不同隔离级别MVCC的区别

RR级别: 在事物开启后, 只会在事务开启的一瞬间生成一个read view ,所以解决了RC级别不可重复读的问题。

RC级别: 在事物开启后,每一次查询数据都会生成一个read view,所以有可能出现读取数据不一致的情况。

7、MVCC是否解决了幻读的问题

首先严格意义上来说没有, MVCC利用版本链,undo log,Read View可以在快照读模式下解决幻读问题,并且不用加锁解决读写冲突问题,极大的增加了数据库的并发量。 但在当前读模式下仅仅依靠MVCC不能解决幻读问题,必须依赖next-key锁(行锁+gap锁)来解决,这是因为当前读必须获取最新数据。

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

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

相关文章

项目实战 Java读取Excel数据

项目实战 Java读取Excel数据前言实现步骤导入POI依赖示例Excel表结构编写读取Excel工具类实现思路读取Excel数据工具类实现代码取出从excel中获取的数据&#xff0c;并插入到数据库中总结如果博主的文章对您有所帮助&#xff0c;可以评论、点赞、收藏&#xff0c;支持一下博主!…

jQuery复习

jQuery&#xff1a;是一个js函数库&#xff0c;口号写少 做多 write less do more 封装简化DOM操作&#xff08;增删改查&#xff09;/ajax 为什么使用&#xff1a;强大的选择器&#xff1a;方便快速查找DOM元素 隐式遍历&#xff1a;一次监听多个 读写合一&#xff1a;读数据&…

DEFORMABLE DETR学习笔记

DEFORMABLE DETR学习笔记 DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION ABSTRACT DETR最近被提出&#xff0c;以消除在目标检测中需要许多手工设计的组件&#xff0c;同时展示良好的性能。但由于Transformer注意模块在处理图像特征映射时的局…

基于51单片机驱动A4988实现步进电机逆时针转动

基于51单片机驱动A4988实现步进电机逆时针转动一、简介二、接线典型接线图实际接线三、部分代码引脚定义定时器初始化主函数四、实验现象五、注意事项一、简介 A4988 是一款完全的微步电动机驱动器&#xff0c;带有内置转换器&#xff0c;易于操作。该产 品可在全、半、1/4、1…

Synchronized 与 Lock 的使用

Synchronized的使用 以卖票为例 //基本的卖票例子/*真正的多线程开发&#xff0c;公司中的开发,降低耦合性线程就是一个单独的资源类&#xff0c;没有任何附属的操作1.属性、方法*/ public class SaleTicketDemo01 {public static void main(String[] args) {//多个线程操作同…

python 可视化解释模型

1. 自定义DataSet MakeDataset.py 首先准备好一个数据集文件&#xff0c;这里以mydata文件夹存放图片数据&#xff0c; 实现自定义DataSet class MyDataset(Dataset):def __init__(self,resize):super(MyDataset,self).__init__()self.resize resizedef __len__(self):retur…

【软件分析第13讲-学习笔记】符号执行 Symbolic Execution

文章目录前言正文符号执行基于霍尔逻辑的符号执行谓词转换计算最弱前置条件动态符号执行符号执行&#xff1a;进一步探究小结参考文献前言 创作开始时间&#xff1a;2022年11月16日18:46:31 如题&#xff0c;学习一下符号执行 Symbolic Execution的相关知识。参考&#xff1a…

计算机毕业设计jsp家校互动系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 家校互动系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使用jav…

Linux用户操作(22.9.21)

学习目标&#xff1a; 用户账号管理Linux用户操作Linux用户组操作&#xff08;一&#xff09;用户账号管理 1、用户与用户组文件 在Linux系统当中&#xff0c;默认情况下所有用户信息保存在 /etc/passwd文件内&#xff0c;用户密码信息保存在/etc/shadow文件内&#xff1b;所…

43、Spring AMQP TopicExchange

1、TopicExchange 2、案例 3、通过配置类实现 1、配置TopicConfig 2、添加Listener 3、测试结果 4、通过注解实现 1、配置Linstener 2、测试结果 5、总结分析 学到这里&#xff0c;关于RabbitMQ的五种消息模型就结束了。 1、第一种消息模型&#xff1a;单个队列&#xff0c…

相机模型总结

目录相机模型前言1. pinhole 针孔模型2. Omnidirectional Camera Model 全向相机模型2.1 Unified model for catadioptric cameras 反射式相机统一模型2.2 Extended Unified model for catadioptric cameras (EUCM)2.3 Omnidirectional Camera Model By Scaramuzza畸变模型1. E…

linux篇【10】:进程信号

目录 一.信号入门 1.信号是操作系统内一个内置机制 2.前后台进程的几条命令与ctrlc 3.信号分类 4.信号产生是异步的 5.进程是如何记住这个信号 &#xff08;3&#xff09;存储方式&#xff1a;位图 二.signal ——对某信号设置自定义行为(捕捉)的函数 &#xff08;1&a…

【Linux】进程间通信之消息队列

系列目录 进程间通信——共享内存 进程间通信——信号量 文章目录 一、概念 二、消息队列函数 1.msgget 2.magsnd 3.msgrcv 4.msgctl 三、掌握消息队列操作 一、概念 提供了一种从另一种进程发送一个数据块的方法。而且每个数据块都被认为含有一个类型&#xff0c;接…

Python3《机器学习实战》学习笔记(十):ANN人工神经网络代码详解(数字识别案例以及人脸识别案例)

文章目录一、构建基本代码结构1.1预处理数据的工具包1.2 初始化参数1.3工具类sigmoid1.4工具类矩阵变换1.5初始化theta1.6正向传播1.7反向传播1.8梯度下降1.9训练模块二、MNIST数字识别三、人脸识别四、总结一、构建基本代码结构 1.1预处理数据的工具包 """Dat…

2021年认证杯SPSSPRO杯数学建模C题(第一阶段)破局共享汽车求解全过程文档及程序

2021年认证杯SPSSPRO杯数学建模 C题 破局共享汽车 原题再现&#xff1a; 自 2015 年以来&#xff0c;共享汽车行业曾经“百花齐放”&#xff0c;多个项目获得巨额融资。但因为模式过重、运营成本过高、无法盈利等问题&#xff0c;陆续有共享汽车公司因为资金链断裂而倒闭。据…

RocketMQ存储设计的奥妙

RocketMQ作为一款基于磁盘存储的中间件&#xff0c;具有无限积压能力&#xff0c;并提供高吞吐、低延迟的服务能力&#xff0c;其最核心的部分必然是它优雅的存储设计。 1、存储概述 RocketMQ存储的文件主要包括Commitlog文件、ConsumeQueue文件、Index文件。 RocketMQ将所有…

温振传感器有几种传输方式?

在现代化社会中&#xff0c;各种机器无时无刻参与着我们的日常生活&#xff0c;承担在我们的周围承担起重要作用&#xff0c;轴承、电机、泵体等也成为工业文明中关键存在&#xff0c;它们的温度和状态影响着整个工业自动化系统运行的健康和效率。 长期以来&#xff0c;传感器技…

数字集成电路设计(四、Verilog HDL数字逻辑设计方法)(一)

文章目录1.Verilog语言的设计思想和可综合特性2. 组合电路的设计2.1 数字加法器2.2 数据比较器2.3 数据选择器2.4 数字编码器2.4.1 3位二进制8线-3线编码器2.4.2 8线-3线优先编码器2.4.3 二进制转化十进制8421BCD编码器&#xff08;重要&#xff09;2.4.4 8421BCD十进制余3编码…

ue4使用Niagara粒子实现下雨效果,使用蓝图调节雨量

一、使用Niagara粒子系统实现下雨效果 1. 首先创建一个雨水的材质 新建 — 材质 2. 创建Niagara系统 新建 新建 — FX — Niagara系统 — 来自所选发射器的新系统 — 下一步 — 选择Fountain — 点击号&#xff0c;点击完成 删除下面的“Add Velocity in Cone” 添加“…

矩池云如何自定义端口,访问自己的web项目

本文将向您介绍如何在矩池云租用服务器的时候自定义端口&#xff0c;并将您的 web 项目部署到自定义端口&#xff0c;最后实现在本地通过自定义端口对应链接访问服务。 上传代码和数据 首先&#xff0c;您需要将本地的项目代码和数据上传到矩池云网盘。这里为了方便您测试使用…