MySql之MVVC总结

server/2024/11/29 16:55:22/

多版本并发控制MVVC,Multi-Version Concurrency Control,通过数据行的多个版本来控制数据库的并发。mysql只有InnoDB引擎才支持MVVC.

通过管理每条记录的多个版本,实现数据库事务并发时一致性读,当前事务A读取正在被其他事务B更新的数据行时,事务A能读到被事务B更新之前的记录。解决读写冲突问题。

要明白MVVC的原理,需要知道三个知识点:隐式字段、Undo Log、Read View

1、隐式字段

mysql数据库中的,每条记录,除了我们自己定义的字段外,还有数据库定义的几个隐式字段

字段名称字段占用作用
隐式主键DB_ROW_ID6 byte如果表没有创建主键,InnoDB引擎会根据DB_ROW_ID 产生一个索引
事务IDDB_TRX_ID6 byte最新的事务ID
回滚指针DB_ROLL_PTR7 byte指向这条记录的上一个版本

2、回滚日志 Undo Log

当一个事务进行写操作时,mysql将需要修改的数据的旧版本数据,写到Undo Log中,然后再将新的数据写入到数据库中。在事务提交之前,Undo Log中的数据可用于回滚。

Undo Log的版本链,是一个链表,用于维护这些历史数据版本。在这个版本链中,每个版本对应一个版本号或时间戳,新版的数据会添加到这个链表的头部。

回滚指针把该数据行的所有版本连接起来。

多个事务对同一条记录进行操作,会产生多个版本,但如果一个事务想查询某行记录,那这个事务需要读取哪个历史版本的数据哪?哪些历史版本的数据,该事务允许被读取到?这就会用到下一个概念:Read View

3、Read View

Read View 是事务进行快照读操作时产生的读视图。在事务进行快照读的那一时刻,会产生一个数据库当前的快照,记录并维护系统当前活跃的事务id,并且该事务id值是递增的。

Read View的几个全局变量:

  • creator_trx_id,创建读视图的事务id,增、删、改事务该有资格分配该事务id,读事务的id为0
  • trx_ids, 表示在生成该读视图时,当前系统活跃的读写事务的事务id列表
  • up_limit_id, 活跃事务列表中,最小的事务id,也就是最早的事务id
  • low_limit_id, 在生成Read View时,数据库系统应该分配的下一个事务id,也就是活跃列表中的最大id。

Read View 最大的作用就是用来做可见性判断的。用每个事务当时产生的读快照视图,来判断该事务能够看到哪个版本的数据.

可见性算法小结:

一个Read View版本,对于该事务来说,数据总是可见的。其他情况

  • 该事务id< up_limit_Id,也就是活跃列表中最小的事务id时,该版本对该事务可见。
  • 事务id>=low_limit_id,该版本对于该事务是不可见的。
  • 事务id在up_limit_id 和low_limit_id之间,需要判断是否属于活跃列表,如果属于活跃列表,则不可见,否则可见。

4、具体应用

READ UNCOMMITTED隔离级别:读未提交,直接返回最新版本的数据即可

READ COMMITTED和REPEATABLE READ,这两个隔离级别,都必须保证读到已提交的数据。核心问题就是,需要判断版本列表中哪个版本是当前事务可见的,这就是Read View要解决的重要问题。

SERIABLIZABLE隔离级别,InnoDB是使用加锁的方式来实现。


http://www.ppmy.cn/server/145946.html

相关文章

使用 Canal 实时从 MySql 向其它库同步数据

目前绝大多数项目还是采用 mysql 作为数据存储&#xff0c;对于用户访问量较高的网站来说&#xff0c;mysql 读写性能有限&#xff0c;我们通常会把 mysql 中的数据实时同步到 Redis、mongodb、elastic search 等中间件中&#xff0c;应对高并发访问场景&#xff0c;减轻 mysql…

知识图谱嵌入评估的常用任务

知识图谱嵌入&#xff08;KGE&#xff09;是通过将图中的实体和关系表示为低维向量&#xff0c;从而使得原本复杂的图结构可以被机器学习模型处理&#xff0c;并用于后续任务。有效的评估方法能够帮助研究者和工程师了解模型在不同任务中的表现&#xff0c;并优化模型以提升其在…

卷积神经网络:图像特征提取与分类的全面指南

目录 引言 卷积层&#xff1a;图像特征的初步提取 局部连接与权重共享 多个卷积核与特征图 激活函数 池化层&#xff1a;降低维度与增强不变性 最大池化与平均池化 空间不变性 全连接层&#xff1a;特征整合与分类决策 特征整合 分类器 Dropout与正则化 训练与优化…

【C++贪心 数论】991. 坏了的计算器|1909

本文涉及知识点 C贪心 数论&#xff1a;质数、最大公约数、菲蜀定理 LeetCode991. 坏了的计算器 在显示着数字 startValue 的坏计算器上&#xff0c;我们可以执行以下两种操作&#xff1a; 双倍&#xff08;Double&#xff09;&#xff1a;将显示屏上的数字乘 2&#xff1b…

快速排序 C++

题目一 解题思路 快排思路 首先设定一个分界值(基准值)&#xff0c;通过该分界值将数组分成左右两部分。将大于或等于分界值的数据集中到数组右边&#xff0c;小于分界值的数据集中到数组的左边。此时&#xff0c;左边部分中各元素都小于分界值&#xff0c;而右边部分中各元素…

【Maven Helper】分析依赖冲突案例

目录 Maven Helper实际案例java文件pom.xml文件运行抛出异常分析 参考资料 Maven Helper A must have plugin for working with Maven. easy way for analyzing and excluding conflicting dependenciesactions to run/debug maven goals for a module that contains the cur…

通过DBUA升级 Oracle 11g到Oracle12c版本

Oracle 11g升级到Oracle12c Oracle11g数据库环境准备与数据备份 环境&#xff1a; oracle11.2.0.4 to oralce12.2.0.1 升级方案&#xff1a; 升级方案很多种&#xff0c;我们ORACLE培训课程第8阶段有所讲所有的升级方案&#xff0c;我们这里采用DBUA官方建议的方法 1、手…

ctfshow -web 89-115-wp

89. 显然&#xff0c;这里是需要绕过preg_match&#xff0c;绕过preg_match有三种方法 CTF 总结02&#xff1a;preg_match()绕过_pregmatch函数绕过-CSDN博客 90. 考intval。 这个与赣ctf有道题差不多&#xff0c;我是直接传入num4476a&#xff0c;intval&#xff08;4476a&a…