Mysql如何实现原子性(MVCC实现原理)

news2024/12/26 22:06:52

Mysql如何实现原子性(MVCC实现原理)

Mysql实现原子性主要通过一下机制

  1. MVCC多版本并发控制

MVCC的实现原理

在介绍MVCC的实现原理之前需要先介绍一下Mysql表中的隐藏字段 , 以及undo_log版本链以及readview

1. Mysql中的隐藏字段

Mysql在创建表的时候除了我们所定义的字段还定义了一下三个字段

  1. DB_TEX_ID --> 同来记录当前事务ID , 该字段是一个自增的Int , 每当事务开启后 , 就会对该ID自增
  2. DB_ROLL_TRX --> 该字段是记录上一个undo_log日志的地址
  3. DB_ROW_ID --> 当用户未指定主键时 , 该字段会作为主键

2. 什么是undo_log版本链

在事务执行增删改之前 , 会在undo_log日志当中记录当前的数据信息 , 并保存DB_TROLL_TAX记录上一个undo_log日志地址

如下图所示 , 我们开启了四个事务 , 对于每个事务的版本号为2 , 3 , 4 ,5

在这里插入图片描述

那么在事务的创建过程中就会在undo_log日志当中注册版本信息 , 如下图

在这里插入图片描述

那么当上述的事务都注册完毕就会形成一个版本链

在这里插入图片描述

3. 什么是readview

readview就是通过一定的机制来判断 , 当前版本的事务是否可以被读取 , 也就是说是快照读 sql执行的依据

当前读:

当前读就是记录最新版本的数据 , 在读取过程中会加锁

快照读

就是简单的select语句 , 在读取过程中不加锁 是非阻塞的 , 读取的数据有可能是当前数据 ,也有可能是历史数据

而对于快照读所读取的数据是什么也就是通过readview一下几点来实现的

首先在readview中保存了下列字段 , 分别用来记录当前并发日志的信息 , 通过该消息与一定的规则来实现快照读

在这里插入图片描述

规则如下

在这里插入图片描述

4. MVCC是如何基于readview, undo_log版本链与隐藏字段实现快照读

还是针对下述事务 , 我们来判断一下事务无的;i两次快照读分别命中了那个版本的数据

在这里插入图片描述

首先我们来分析第一次查询

在这里插入图片描述

m_ids: { 3 , 4 , 5}

min_trx_id: 3

max_trx_id : 6

creator_trx_id : 5

分析完readview后我们就要从undo_log版本链进行比对

在这里插入图片描述

在这里插入图片描述

可以看出来对于第一个查询命中的事务2 , 对于第二个查询命中的是事务3

介绍完隐藏字段 , undo_log日志链与readview这三个概念后, 对于MVCC要做什么怎么做应该有了一个大致的了解

MVCC多版本并发控制也就是在多个事务并发的情况下 , 通过readview判断快照读命中的是哪个语句 , 进而获取查询信息

简述一下你对MVCC机制的理解?
mvcc机制翻译过来也就是多版本并发控制,MySQL采取该机制主要是为了解决并发情况下事务的三种场景,读读(在并发环境中对读读不会产生影响),读写(脏读,幻读,不可重复读),写写(脏写)。mvcc机制通过非阻塞读的方式来提高并发情况下的读写性能,同时也通过readview机制与undolog版本链实现快照读的版本选择。对于不同的事物隔离级别快照读的时机,对于读已提交情况在每次读取都会生成一个快照,而对于可重复读只会在第一次读的时候生成快照从而保证多次读取数据的一致性
同时对于readview,该机制是帮助快照读选取具体的版本的。在readview中保存了四个字段分别为活跃事物id,最小事物id,最大事物id,当前执行事务id。除此之外还提供了一定的规则来判断具体哪个undolog事务版本可以被采用,主要为一下几点。

  1. 如果该事务执行完毕,则运行访问,具体表现为事务版本小于最小ID;或者事务id在最大id和最小id之前且为非活跃id2. 如果是当前事务读,则运行访问,具体表现为,事务id等于当前事务ID3. 如果事务在快照读之后开启,则不允许访问,具体表现为事务id大于最大id
    undolog版本链,也就是对于所有事物在执行前需要现在undolog日志当中记录所执行数据的当前状态与上一个版本的指针地址,当多个事务完成注册就可以通过上版本的指针地址链接形成一个版本链

=============================================================

面试官:事务中的隔离性是如何保证的呢?(你解释一下MVCC)

候选人:事务的隔离性是由锁和mvcc实现的。

其中mvcc的意思是多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,它的底层实现主要是分为了三个部分,第一个是隐藏字段,第二个是undo log日志,第三个是readView读视图

隐藏字段是指:在mysql中给每个表都设置了隐藏字段,有一个是trx_id(事务id),记录每一次操作的事务id,是自增的;另一个字段是roll_pointer(回滚指针),指向上一个版本的事务版本记录地址

undo log主要的作用是记录回滚日志,存储老版本数据,在内部会形成一个版本链,在多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表

readView解决的是一个事务查询选择版本的问题,在内部定义了一些匹配规则和当前的一些事务id判断该访问那个版本的数据,不同的隔离级别快照读是不一样的,最终的访问的结果不一样。如果是rc隔离级别,每一次执行快照读时生成ReadView,如果是rr隔离级别仅在事务中第一次执行快照读时生成ReadView,后续复用

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

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

相关文章

遇到问题:hive中的数据库和sparksql 操作的数据库不是同一个。

遇到的问题: 1、hive中的数据库和sparksql 操作的数据库不同步。 观察上面的数据库看是否同步 !!! 2、查询服务器中MySQL中hive的数据库,发现创建的位置没有在hdfs上,而是在本地。 这个错误产生的原因是&…

Leetcode - 周赛426

目录 一,3370. 仅含置位位的最小整数 二,3371. 识别数组中的最大异常值 三,3372. 连接两棵树后最大目标节点数目 I 四,3373. 连接两棵树后最大目标节点数目 II 一,3370. 仅含置位位的最小整数 两种做法&#xff1a…

用 Python 从零开始创建神经网络(十四):L1 和 L2 正则化(L1 and L2 Regularization)

L1 和 L2 正则化(L1 and L2 Regularization) 引言1. Forward Pass2. Backward pass到此为止的全部代码: 引言 正则化方法旨在降低泛化误差。我们首先讨论的正则化形式是L1正则化和L2正则化。L1和L2正则化用于计算一个数值(称为惩…

浅谈网络 | 应用层之流媒体与P2P协议

目录 流媒体名词系列视频的本质视频压缩编码过程如何在直播中看到帅哥美女?RTMP 协议 P2PP2P 文件下载种子文件 (.torrent)去中心化网络(DHT)哈希值与 DHT 网络DHT 网络是如何查找 流媒体 直播系统组成与协议 近几年直播比较火,…

云计算介绍_3(计算虚拟化——cpu虚拟化、内存虚拟化、io虚拟化、常见集群策略、华为FC)

计算虚拟化 1.计算虚拟化介绍1.1 计算虚拟化 分类(cpu虚拟化、内存虚拟化、IO虚拟化)1.1.1 cpu虚拟化 一级目录 一级目录 一级目录 一级目录 1.计算虚拟化介绍 1.1 计算虚拟化 分类(cpu虚拟化、内存虚拟化、IO虚拟化) 1.1.1 cpu虚…

关于 Qt编译遇到fatal error C1189: #error: “No Target Architecture的 解决方法

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/144205902 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

基于python的某音乐网站热门歌曲的采集与分析,包括聚类和Lda主题分析

一项目背景 在当前竞争激烈的市场环境下,分析酷狗音乐上的热门歌曲及其用户行为趋势,对平台运营、歌曲推荐和音乐创作具有重要意义。尤其是通过对酷狗音乐平台热门歌曲的数据采集与分析,可以深入理解用户偏好、歌曲流行的规律以及市场需求的…

React 路由与组件通信:如何实现路由参数、查询参数、state和上下文的使用

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

掌握排序艺术:Java 中常见排序算法的深度解析与实战

排序是计算机科学中的一个基本问题,它在数据处理、搜索和分析中扮演着重要角色。Java提供了多种内置的排序方法,但了解不同排序算法的工作原理及其优缺点对于优化性能和选择合适的解决方案至关重要。本文将详细介绍几种常见的排序算法,包括它…

html+css网页设计马林旅行社移动端4个页面

htmlcss网页设计马林旅行社移动端4个页面 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&#…

Linux系统编程之进程控制

概述 在Linux系统中,创建一个新的进程后,如何对该进程进行有效的控制,是一项非常重要的操作。控制进程状态的操作主要包括:进程的执行、进程的等待、进程的终止等。下面,我们将逐个进行介绍。 进程的执行 创建进程后&a…

猜数字的趣味小游戏——rand函数、srand函数、time函数的使用

文章目录 前言一、随机数的生成1.1. rand函数1.2. srand函数1.3. time函数 二、设置随机数的范围三、猜数字游戏的代码实现总结 前言 上一篇博客我们写了一个电脑关机的小游戏,我篇博客我们写一个猜数字的小游戏,学习rand函数、srand函数、time函数的使…

ScratchLLMStepByStep:一步一步构建大语言模型教程

前言 在学习大语言模型的时候,总会遇到各种各样的名词,像自注意力、多头、因果、自回归、掩码、残差连接、归一化等等。这些名词会让学习者听的云里雾里,觉得门槛太高而放弃。 本教程将会带你从零开始,一步一步的去构建每一个组…

从0开始学PHP面向对象内容之常用设计模式(享元)

二、结构型设计模式 7、享元模式(Flyweight Pattern) 这里是引用享元模式(Flyweight Pattern) 是一种结构型设计模式,旨在通过共享对象来减少内存使用,尤其适用于大量相似对象的场景。通过共享和重用对象的…

时钟约束在STA中的作用

时钟约束在STA中的作用 1.约束作为声明2.约束作为断言3.约束作为指令4.约束作为异常5. 约束的角色变化 简介: STA工具从相应的设计描述中获取电路描述,HDL是最常用的形式。它还接受库输入–主要用来了解依赖技术的特性,如通过特定门的延迟值。…

Springboot 修改post请求接口入参或重新赋值

前言 很久之前写过一篇就是自动填充接口参数的,利用的 HandlerMethodArgumentResolver 自定义注解 Springboot Controller接口默认自动填充 业务实体参数值_springboot设置入参默认值-CSDN博客 现在这一篇也差不多,达到的目的就是重新去给post请求的参数…

机器学习:精确率与召回率的权衡

高精度意味着如果诊断得了那种罕见病的病人,可能病人确实有,这是一个准确的诊断,高召回率意味着如果有一个还有这种罕见疾病的病人,也许算法会正确的识别他们确实患有这种疾病,事实中,在精确与召回之间往往…

海盗王用golang重写的AccountServer功能

自从用golang重写了海盗王的网关gateserver以来,一直想把accountserver也重写了,但是一直没有进行。 趁上次刚写好那个golang版的更新器,还有些熟悉,于是把原来AccountServer的C代码重写读了个大概。它原版的写得太过于复杂&#…

【动态规划】小S的货船租赁冒险

文章目录 一、问题描述输入格式输出格式 问题背景二、动态规划思想三、代码实现细节初始化二维数组遍历每种货船遍历预算并更新状态提前剪枝优化 四、代码实现算法复杂度分析优化思路 一、问题描述 李华在码头租货船,有 Q 种货船可以租赁。第 i 种货船的数量为 m[i…

基于 MVC 架构的 SpringBoot 高校行政事务管理系统:设计优化与实现验证

摘 要 身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提升,而读书就是人们获得精神享受非常重要的途径。为了…