MySQL的多版本并发控制(MVCC)

MVCC

MVCC,是Multiversion Concurrency Control的缩写,翻译过来是多版本并发控制,和数据库锁样,他也是一种并发控制的解决方案

我们知道,在数据库中,对数据的操作主要有2种,分别是读和写,而在并发场景下,就可能出现以下 旦三种情况:读-读并发,读-写并发,写-写并发
我们都知道,在没有写的情况下读-读并发是不会出现问题的,而写-写并发这种情况比较常用的就是通过加锁的方式实现。那么,读-写并发则可以通过MVCC的机制解决

快照读和当前读

快照读:就是读取的快照数据,即快照生成的那一刻的数据,像我们常用的普通的SELECT语句在不加锁的情况下就是快照读

如:select *  from table_name  where xxx;

当前读:当前读就是读取最新数据,加锁的select,或者对数据进行增删改都会进行当前读,

如:SELECT *FROM xx_table LOCK IN SHARE MODE;

SELECT *FROM xx_table FOR UPDATE;

INSERT INTO xx_table ...;DELETE FROM xx_table ...;UPDATE xx_table ...;

在mysql中只有已提交读和重复读两种事物隔离级别才会使用快照读

Undolog

undo log是Mysql中比较重要的事务日志之一,顾名思义,undo log是一种用于回退的日志,在事务没提交之前,MySQL会先记录更新前的数据到 undo log日志文件里面,当事务回滚时或者数据库崩溃时,可以利用 undo log来进行回退。
这里面提到的存在undo log中的"更新前的数据”就是我们前面提到的快照。所以,这也是为什么很多人说UndoLog是MVCC实现的重要手段的原因。
那么,一条记录在同一时刻可能有多个事务在执行,那么,undo log会有一条记录的多个快照,那么在这一时刻发生SELECT要进行快照读的时候,要读哪个快照呢?
这就需要用到另外几个信息了

行记录的隐式字段

数据库中除了自己定义的字段外,还有一些重要的隐式字段

  • db_row_id:隐藏的行 ID,用来生成默认聚集索引。如果我们创建数据表的时候没有指定聚集索引,这时 InnoDB 就会用这个隐藏 ID 来创建聚集索引。采用聚集索引的方式可以提升数据的查找效率。
  • db_trx_id:操作这个数据的事务 ID,也就是最后一个对该数据进行插入或更新的事务 ID。
  • db_roll_ptr:回滚指针,也就是指向这个记录的 Undo Log 信息

因为每一次修改之前都会先存储一份快照到undo log中,那么这几个隐式字段一会一起保存到undo log中,就这样,每一个快照中都有一个db_trx_id 事物id字段表示了对这条记录最新一次修改的事物ID,以及一个回滚指针指向上一个快照地址

Read View

有了undo log,又有了几个隐式字段,我们好像还是不知道具体应该读取哪个快照,那怎么办呐

这就需要用到read View

read view 主要来帮我们解决可见性问题的,即他会来告诉我们应该看到哪个快照,不应该看到哪些快照

在 Read View 中有几个重要的属性:

  • trx ids,系统当前未提交的事务 ID 的列表
  • low limit id,应该分配给下一个事务的id 值
  • up limit id,未提交的事务中最小的事务 ID
  • creator trx id,创建这个 Read View 的事务ID

其实原值比较简单:那就是事物ID大的事务应该能看到事务ID小的事物的变更结果,反之则不能

所以,总结一下,

在InnoDB中,MVCC就是通过Read View + Undo Log来实现的,undo log中保存了历史快照,r而Read View用来判断具体哪一个快照是可见的。

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

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

相关文章

Pushmall智能AI数字名片— —SCRM客户资源管理系统

推贴数字AI名片说明: **Pushmall智能AI数字名片:**基于靠谱人脉的地理位置服务,资源查询,数字名片定制服务、企业名片:相互引荐、提供需求;建人脉群、客户群,及简介、短视频、宣传文档、电子图…

逸学Docker【java工程师基础】3.1安装Jenkins

1.下载镜像 docker pull jenkins/jenkins:lts 2.运行容器 docker run -d -u root -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime --name jenkins jenkins/jenkins:lts 3.要启动名为 jenkins 的 Docker 容器 docker st…

Logstash应用-同步ES(elasticsearch)到HDFS

1.场景分析 现有需求需要将elasticsearch的备份至hdfs存储,根据以上需求,使用logstash按照天级别进行数据的同步 2.重难点 数据采集存在时间漂移问题,数据保存时使用的是采集时间而不是数据生成时间采用webhdfs无法对文件大小进行设置解决…

Codeforces Round 768 (Div. 1) D. Flipping Range(思维题 等价类性质 dp)

题目 思路来源 官方题解 洛谷题解 题解 可操作的最短区间长度肯定是gcd,记为g,然后考虑如何dp 考虑g个等价类,每个等价类i,ig,i2*g,... 每次翻转长度为g的区间,会同时影响到g个等价类总的翻转的奇偶性, 性质一&…

叉车车载终端定制_基于MT6762安卓核心板的车载终端设备方案

叉车车载终端是一款专为叉车车载场景设计的4英寸Android车载平板电脑。它采用了高能低耗的8核ARM架构处理器和交互开放的Android 12操作系统,算力表现强大。此外,该产品还具备丰富的Wi-Fi-5、4G LTE和蓝牙等通讯功能,可选配外部车载蘑菇天线&…

记录centos7.9 离线安装fastllm 编译遇到的问题

centos7.9 安装fastllm 编译步骤 Step1安装cmake: 参考: https://bitsanddragons.wordpress.com/2022/09/19/error-cmake-3-1-or-higher-is-required-you-are-running-version-on-centos-7-x/ ​ 问题1:/lib64/libstdc.so.6: version GLIBCXX_3.4.20‘ not found …

C语言程序设计——程序流程控制方法(二)

循环结构 while语句 while(表达式){代码块; }do{代码块; }while(表达式)while语句分为do-while和while两种,区别在于循环之前是不是先执行一次循环的内容,可以类似于i和i的关系,本质上来讲是相同的。当表达式为真时,则会执行一次…

常用的排序算法

该文章笔记结合菜鸟教程的排序算法,如果后面认识有改动或者完善再继续 最近笔试很多题目都考察过了基本的排序算法,尤其是快排、冒泡、选择,大家在这一方面一定要注意下。 一. 总述 1. 时间复杂度 详细介绍 1. 冒泡排序 冒泡排序重复地走…

大白菜U盘安装系统-戴尔电脑

1. 把U盘插入电脑,启动盘去大白菜官网找,镜像可以去微软官网下,想要专业版的网上找资源。 2. 重启电脑,等出现log之后狂按F12,进入BOSS模式。 3. 选择UEFI...也就是下面白色的,按下回车。 4. 选第一个 5.…

生成学习全景:从基础理论到GANs技术实战

本文全面探讨了生成学习的理论与实践,包括对生成学习与判别学习的比较、详细解析GANs、VAEs及自回归模型的工作原理与结构,并通过实战案例展示了GAN模型在PyTorch中的实现。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产…

基于java的SSM框架实现在线投稿网站系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现在线投稿网站系统演示 摘要 随着计算机技术的飞速发展,稿件也已进入信息化时代。为了使稿件管理更高效、更科学,决定开发投稿审稿系统。 本文采用自顶向下的结构化的系统分析方法,阐述了一个功能全面的投稿审稿系统…

Open3D 两片点云的最小/最大距离(23)

Open3D 两片点云的最小/最大距离(23) 一、效果展示二、使用步骤1.代码三、cloudcompare量距小工具一、效果展示 算法与实际量测的结果保持一致,输出最近距离和对应点 二、使用步骤 1.代码 import open3d as o3d import numpy as np# 读取点云数据 cloud_2 = o3d.io.re…

性能瓶颈分析定位

用vmstat、sar、iostat检测是否是CPU瓶颈 用free、vmstat检测是否是内存瓶颈 用iostat、dmesg 检测是否是磁盘I/O瓶颈 用netstat检测是否是网络带宽瓶颈 1 首先进行OS层面的检查确认 首先要确认当前到底是哪些进程引起的负载高,以及这些进程卡在什么地方&#x…

软件需求分析报告—word

技术要求 1.1接口要求 1.2可靠性,稳定性,安全性,先进性,拓展性,性能,响应。 2.系统安全需求 2.1物理设计安全 2.2系统安全设计 2.3网络安全设计 2.4应用安全设计 2.5用户安全管理 进主页获取更多资料

目前目标跟踪算法研究202308

目标跟踪算法综述——附各算法源码和论文 概述 TBD(two-shot):SORT、DeepSORT、StrongSORT、ByteTrack、OC-SORT JDE(one-shot):BoT-SORT、 0 MutiSORT(多目标跟踪策略) 0.1 trackdetection 训练一个网…

Java基础语法

1.第一份程序 1.1.代码编写 /*块注释 HelloWord.java 内部 *//**文档注释 * 作者:limou3434 */ public class HelloWord {public static void main(String[] args){System.out.println("Hello Word!");//打印“Hello Word!”} }直接上代码,上…

工具篇--SpringCloud--openFeign--Feign.builder()自定义客户端

文章目录 前言一、自定义客户端:1.1 定义外部接口类:1.2 接口代理类生成:1.3 方法的远程调用: 二、Feign.builder()自定义客户端原理:2.1 FeignClientFactoryBean2.2 客户端的配置设置:2.3 代理类的生成&am…

【GitHub项目推荐--AI 开源项目/涵盖 OCR、人脸检测、NLP、语音合成多方向】【转载】

今天为大家推荐一个相当牛逼的AI开源项目,当前 Star 3.4k,但是大胆预判,这个项目肯定要火,未来 Star 数应该可以到 10k 甚至 20k! 着急的,可以到 GitHub 直接去看源码 传送门:https://github.c…

GNSS差分码偏差(DCB)原理学习与数据下载地址

一、DCB原理 GNSS差分码偏差(DCB,Differential Code Bias)是由不同类型的GNSS信号在卫星和接收机不同通道产生的时间延迟(硬件延迟/码偏差)差异,按照频率相同或者不同又可以细分为频内偏差(例如…

电子电器架构车载软件 —— 集中化架构软件开发

电子电器架构车载软件 —— 集中化架构软件开发 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任…
最新文章