MySQL数据库MVCC机制底层原理详解

mvcc机制即多版本并发控制

当在事务中使用了写操作(增删改)语句时会给当前事务生成一个事务id,事务id是递增的

同时,对于被修改的行的数据会创建一个数据版本 ,这个数据版本除了包含原有的字段还会包含一个事务id和一个回滚指针

接下来通过几条sql语句来讲解mvcc机制:

首先假设这里有一个account表,此时里面只有一条数据

 

trx_id:事务id

roll_pointer:回滚指针 

假设上面的4个事务都已经开启了,现在执行3行和4行,由于是写操作,所以会生成一个事务id,这里我们假设是110 和 120,注意此处操作的不是account表,只是为了生成事务id。

接下来执行第5行,同样是一个写操作也会生成事务id,同时上面我们说过,对于被修改的数据行还会生成一个数据版本,于是这个新生成的数据版本就是当前数据行最新的版本,它的回滚指针会指向上一个版本:

紧接着事务130就提交了,然后另一个事务指向了一个查询语句,这里大家应该都知道结果是ting130,因为事务130提交了。注意查询语句不会生成事务id

此时继续往下执行,8和9行,同样是更新语句所以也会生成数据版本,注意每个事务中只有第一次执行写操作语句时会生成事务id。

此时第10行执行一个查询语句,我们分析一下此时的查询结果是什么:

当事务中第一次执行查询操作时,会生成一致性视图 read -view,也可以称为快照,他由当前未提交事务id组成的数组和已创建的最大事务id(max_id)组成,其中未提交事务id中最小的id我们称为min_id,通过min_id和max_id可以把事务分为三个部分:

由于min_id是所有未提交事务中最小的id,所以事务id小于min_id的一定是已经提交的事务是可见的,同时大于max_id的事务,是生成快照时还没有创建的事务,是不可见的,在min_id和max_id之间的事务要分两种情况,在未提交数组中则说明是不可见的,不在则说明事务已经提交是可见的,当执行查询语句,就会沿着版本链从最新的数据开始查,直到查到可见的数据。

所以第7行时,第四个事务就已经生成了快照,当时只有事务130提交了,所以生成的read_view是:[ 110 , 120 ] 130 ,110即为min_id,130为max_id,由于同一个事务中只有第一次使用查询语句时会生成read_view,所以此时第10行的查询语句会沿用上次的read_view即 [ 110 , 120 ] 130

此时我们沿着版本链去查数据,首先查到的是ting112,发现事务id在未提交事务数组中说明不可见,沿着回滚指针往下找到ting111发现同样不可见,继续往下找到ting130,事务id为130 ,130 小于等于max_id并且不在未提交事务数组中,是可见的,于是返回ting130。

接下来继续往下执行,到第14行的时候,又将执行一条查询语句,可以先不看下面自己试着梳理一下返回什么。

此时版本链中又多了两条数据:

我们同样按照read_view在版本链中找,注意,这里不会生成新的read_view会沿用上次生成的

[ 110 , 120 ] 130

首先找到ting122,ting121发现事务id为120不可见,继续往下找到ting112,ting111 事务id为110同样不可见,在往下找到ting130事务id为130是可见的,所以返回ting130

再做个练习:

此时第14行的查询语句会返回什么? 

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

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

相关文章

Linux驱动开发—创建总线,创建属性文件

文章目录 1.什么是BUS?1.1总线的主要概念1.2总线的操作1.3总线的实现 2.创建总线关键结构体解析2.1注册总线到系统2.2 struct bus_type *bus 解析 3.实验结果分析1. devices 目录2. drivers 目录3. drivers_autoprobe 文件4. drivers_probe 文件5. uevent 文件 4.在…

【力扣】划分为k个相等的子集

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 给定一个整数数组 …

【qt】锁

线程安全问题. 多线程程序太复杂了. 加锁 把多个线程要访问的公共资源,通过锁保护起来.>把并发执行变成串行执行. Linux mutex 互斥量. C11引入std::mutex Qt 同样也提供了对应的锁,来针对系统提供的锁进行封装.QMutex 多个线程进行加锁的对象&…

【生日视频制作】室内告白表白祝福布置霓虹灯AE模板修改文字软件生成器教程特效素材【AE模板】

室内告白表白祝福布置霓虹灯生日视频制作教程AE模板改字生成器 怎么如何做的【生日视频制作】室内告白表白祝福布置霓虹灯AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频

Signac R|如何合并多个 Seurat 对象 (1)

引言 在本文中演示了如何合并包含单细胞染色质数据的多个 Seurat 对象。为了进行演示,将使用 10x Genomics 提供的四个 scATAC-seq PBMC 数据集: 500-cell PBMC 1k-cell PBMC 5k-cell PBMC 10k-cell PBMC 实战 在整合多个单细胞染色质数据集的过程中&…

SAP与生产制造MPM系统集成案例

一、需求介绍 某公司为保证企业内部生产管理系统的多项基础数据的同步更新,确保各模块间信息的一致性和准确性,对后续的生产计划和物料管理打下基础,该公司将MPM系统和SAP系统经过SAP PO中间件集成平台进行了集成。MPM全称为Manufacturing…

超实用的8个无版权、免费、高清图片素材网站整理

不管是设计、文章配图,还是视频制作,图片都至关重要。但是图片版权一直都是困扰很多设计、自媒体以及企业的大问题。现在,因为图片侵权被告的案例已经是司空见惯了,有的公众号甚至因为图片版权问题遭受致命打击。 1. Pexels Pexe…

Spring框架:开发者的得力伙伴,魅力何在?

目录 一. Spring介绍 二. Spring搭建 三. Spring Bean管理 ▐ 管理方式 ▐ 依赖注入 四. Spring数据访问层管理 五. Spring集成MyBatis 海漫浩浩,我亦苦作舟!大家一起学习,一起进步! 一. Spring介绍 Spring是什么? Spring 是一个轻量级的, IOC 和 AOP 的一站式 J…

如何使用ssm实现基于java web的计算机office课程平台设计与实现+vue

TOC ssm277基于java web的计算机office课程平台设计与实现vue 绪论 1.1 研究背景 现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利…

博弈论(Nim游戏的扩展)

公平组合游戏ICG 若一个游戏满足: 1.由两名玩家交替行动; 2.在游戏进程的任意时刻,可以执行的合法行动与轮到哪名玩家无关; 3.不能行动的玩家判负; 则称该游戏为一个公平组合游戏。 NIM博弈属于公平组合游戏,但城建的棋类游戏,比如围棋&…

大刀阔斧改革之后,阅文距离“东方迪士尼”更近了吗?

当前,网文IP的确是“富矿”。中国社会科学院文学研究所发布的《2023中国网络文学发展研究报告》显示,截至2023年底,网络文学IP市场规模2605亿元,同比增长近百亿元。 近日,网文产业中的头部企业阅文集团也披露数据称&a…

虚拟内存和linux(操作系统part1)

一个操作系统的虚拟内存和linux部分知识点的笔记整理,资料大多参考于:小林coding和Javaguide。 虚拟内存的作用 第一,虚拟内存可以使得进程运行内存超过物理内存大小,因为程序运行符合局部性原理,CPU 访问内存会有很…

【iOS安全】iPhone8 iOS14.4.2 越狱教程

环境配置 iPhone 8: 固件版本 iOS 14.4.2 (18D70) 产品类型 iPhone10,1 (A1906) 销售型号 MQ862J/A MacBook Pro: macOS 10.15.7 装有CheckRa1n beta 0.12.4 概述 尝试了几个版本的unc0ver和Taurine,发现都不好使 unc0ver显示unsupported…

95.SAP MII功能详解(08)Workbench-Transaction介绍

目录 1.Transaction 2.Properties of transaction 1.Transaction You use transactions to access data from multiple sources and execute processes, which are triggered synchronously or asynchronously.您可以使用事务从多个源访问数据并执行同步或异步触发的流程。…

代码随想录——两个字符串的删除操作(Leetcode 583)

题目链接 动态规划 思路: 确定dp数组(dp table)以及下标的含义 dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。 确定递推公式 当…

PD取电快充协议方案

PD快充协议是通过调整电压和电流来提供不同的充电功率。它采用了一种基于USB-C端口的通信协议,实现了充电器于设备之间的信息交换。在充电过程中设备会向充电器发出请求,要求提供不同的电压和电流,充电器接收到请求后,会根据设备的…

cordova手动更新

1:依赖 cordova-plugin-file cordova-plugin-file-transfer cordova-plugin-file-opener2 第二个参数:application/vnd.android.package-archive来源 cordova plugin add cordova-plugin-app-version//获取cordova版本号 cordova plugin add cordova-p…

Python | Leetcode Python题解之第375题猜数字大小II

题目: 题解: class Solution:def getMoneyAmount(self, n: int) -> int:f [[0] * (n 1) for _ in range(n 1)]for i in range(n - 1, 0, -1):for j in range(i 1, n 1):f[i][j] j f[i][j - 1]for k in range (i, j):f[i][j] min(f[i][j], k …

视频中间件:大华视频设备接入管理应用

前言 上篇博文介绍了视频中间件:海康视频设备的接入管理?,今天给大家带来大华视频设备的接入管理,视频中间件平台支持大华Sdk、大华主动注册、Onvif、Rtsp、Gb28181等方式对大华视频设备的接入管理。同时视频中间件可支持协议互转…

虚幻引擎(Unreal Engine)技术使得《黑神话悟空传》大火,现在重视C++的开始吃香了,JAVA,Go,Unity都不能和C++相媲美!

虚幻引擎(Unreal Engine)火了黑神话游戏。 往后,会有大批量的公司开始模仿这个赛道! C 的虚拟引擎技术通常指的是使用 C 语言开发的游戏引擎,如虚幻引擎(Unreal Engine)等。以下是对 C 虚拟引…