多版本并发控制:MVCC的作用和基本原理
多版本并发控制:MVCC的作用和基本原理
- 1、MVCC简介
- 1.1 快照读与当前读的区别
- 1.1.1 快照读
- 1.1.2 当前读
- 1.2 数据库的读写问题
- 1.3 MVCC的作用
- 2、MVCC实现原理之ReadView
- 2.1 什么是ReadView
- 2.2 ReadView的设计思路
- 2.3 MVCC整体操作流程
1、MVCC简介
1.1 快照读与当前读的区别
mysql在读数据的场景下,根据是否加锁分为了2种读的方式:
1.1.1 快照读
不加锁的简单的select都属于快照读
,即不加锁的非阻塞读。比如:
SELECT * FROM students WHERE ...
之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于MVCC。他在很多情况下,避免了加锁操作,降低了开销。
1.1.2 当前读
当前读读取的是记录最新的数据。加锁的SELECT,或者对数据进行增删改查都会进行当前读。比如:
SELECT * FROM student LOCK IN SHARE MODE; # 共享锁
SELECT * FROM student FOR UPDATE; # 排他锁
INSERT INTO student VALUES ...; # 排他锁
DELETE FROM student WHERE ...; # 排他锁
UPDATE student SET ...; # 排他锁
1.2 数据库的读写问题
数据库多事务场景下的读-读不会存在并发问题,写-写场景存在并发问题,因此一定需要加锁。
那读-写、或者写-读场景下如何处理?
方案一:读操作也采用加锁的方式。
比如,在银行存款的事务中,需要先读取账户余额,然后再进行存/取操作,最后写入数据库中。在这个过程中,是不希望其他事务在该事务还未结束的情况下访问该余额。这种情况下,在读取余额的时候就需要进行加锁操作了。这样就可以保证本次操作结束后的金额,一定是和预期一致的。
1.3 MVCC的作用
数据库的读写问题,除了采用加锁的方式解决,还可以通过MVCC的方式解决。
MVCC(Multiversion Concurrency Control)多版本并发控制
,通过数据行的多个版本管理实现数据库的并发控制。即查询一些正在被另一个事务更新的数据行时,可以看到他们被更新之前的值,不用等待另一个事务释放锁。
所谓的MVCC,就是生成一个ReadView,通过ReadView找到符合条件的记录版本(历史版本由undo日志构建)。查询语句只能读到在生成ReadView之前已提交事务做的修改,不影响其他事务进行写操作,因此可以解决读写问题。相比于加锁的方式解决读写问题,可以大幅提高并发性能。
2、MVCC实现原理之ReadView
MVCC的实现依赖于:隐藏字段、Undo Log、Read View
undo日志版本链中索引记录都包含2个必要的隐藏列:
- trx_id:每次一个事务对某条索引记录进行修改时,都会把该事务的事务id赋值给trx_id隐藏列。
- roll_pointer:每次对某条索引记录进行修改时,都会把旧版本写入到undo日志中,这个隐藏列相当于一个指针,可以通过它来找到该记录修改前的信息。
以下图举例,其中蓝色部分为页面的当前记录,绿色部分为undo日志。
2.1 什么是ReadView
多个事务对同一行记录进行更新会产品多个历史快照,这些历史快照保存在undo log里。如果一个事务想要查询这个行记录,怎么判断读取哪个版本的记录呢?这个时候就可以用上Readview了,它解决了多事务场景下的可见性的问题。
Readview就是事务在使用MVCC机制进行快照读操作时产生的读视图。当事务启动时,会生成数据库系统当前的一个快照,Innodb为每个事务构造了一个数组,用来记录并维护系统当前未提交事务的ID。
2.2 ReadView的设计思路
Readview要解决的核心问题是:判断版本链中的哪个版本是当前事务可见的。
为此,Readview设计了4个核心字段:
- creator_trx_id:创建Readview的事务ID。只有对表做增删改操作时才会分配事务ID,读操作的事务ID默认值为0。
- trx_ids:表示生成Readview时,当前系统中未提交事务的事务id列表。
- up_limit_id:当前未提交事务列表中最小的事务id。
- low_limit_id:生成Readview时,系统应该分配给下一个事务的id值。
举例:现在有id未1,2,3这3个事务,然后id为3的事务提交了。此时一个新的读事务在生成Readview时,trx_ids的值是:[1,2],up_limit_id的值是1,low_limit_id的值是4。
有了Readview,在访问某条记录时,根据以下步骤判断记录的某个版本是否可见
- 如果被访问版本的trx_id值与Readview中的
creator_trx_id
值相同:表明当前呢事务在访问自己修改的记录,所以该版本可以被当前事务访问。 - 如果被访问版本的trx_id值小于Readview中的
up_limit_id
值:表明生成该版本的事务在当前事务生成Readview之前就已经提交了,所以该版本可以被当前事务访问。 - 如果被访问版本的trx_id值大于等于Readview中的
low_limit_id
值:表明生成该版本的事务在当前事务生成Readview之后才开启,所以该版本不可以被当前事务访问。 - 如果被访问版本的trx_id值在Readview中的
up_limit_id
值和low_limit_id
值之间,需要判断一下trx_id值是否在trx_ids
列表中。
1)如果在:说明创建Readview时,生成该版本的事务还未提交,该版本不可以被访问。
2)如果不在:说明创建Readview时,生成该版本的事务已被提交,该版本可以被访问。
2.3 MVCC整体操作流程
查询记录时,MVCC操作流程如下。如果某个版本的数据对当前事务不可见的话,就顺着版本链找下一个版本的数据,继续按照流程进行判断。
- 获取事务自己的版本号,即事务ID
- 生成Readview
- 查询数据,根据数据的版本号(trx_id)值按照2.2中的规则进行判断
- 如果不符合2.2中Readview规则,从undo log中获取历史快照
- 循环执行,最后返回符合2.2中Readview规则中的数据。
相关文章:

多版本并发控制:MVCC的作用和基本原理
多版本并发控制:MVCC的作用和基本原理 1、MVCC简介1.1 快照读与当前读的区别1.1.1 快照读1.1.2 当前读 1.2 数据库的读写问题1.3 MVCC的作用 2、MVCC实现原理之ReadView2.1 什么是ReadView2.2 ReadView的设计思路2.3 MVCC整体操作流程 1、MVCC简介 1.1 快照读与当前…...

ubuntu18.04安装nvm管理本机node和npm
ubuntu18.04安装nvm管理本机node和npm nvm的使用方法1. 安装nvm2. 加载nvm3. 安装执行版本4. 设置默认版本(可选)5. 检查:6. 将配置加入到shell配置文件中(默认已经加入) 如果系统全局的 Node.js 存在,但被 nvm 覆盖了,可以通过禁用或卸载 nvm 恢复到系统…...

【数据结构进阶】红黑树超详解 + 实现(附源码)
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:数据结构 目录 前言 一、红黑树介绍 二、红黑树原理详解 三、红黑树的实现 1. 节点定义 2. 红黑树类型定义及接口声明 3. 红黑树的插入(重点&a…...

leetcode_3092. 最高频率的 ID
https://leetcode.cn/problems/most-frequent-ids/description/ 看到这个数据范围 最极端情况 如果nums全为一个数 并且数量取到最大 那么范围是10的10次方 需要longlong储存 这题主要运用了哈希表配合multiset实现 哈希表主要用作存储某个数的出现次数 mst则用于记录出现次…...

鸿蒙仓颉环境配置(仓颉SDK下载,仓颉VsCode开发环境配置,仓颉DevEco开发环境配置)
目录 1)仓颉的SDK下载 1--进入仓颉的官网 2--点击图片中的下载按钮 3--在新跳转的页面点击即刻下载 4--下载 5--找到你们自己下载好的地方 6--解压软件 2)仓颉编程环境配置 1--找到自己的根目录 2--进入命令行窗口 3--输入 envsetup.bat 4--验证是否安…...

数据统计–图形报表(day11)
Apache ECharts 介绍 Apache ECharts 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。 官网地址:Apache ECharts 入门案例 Apache Echarts官方…...

源码分析之Openlayers样式篇CircleStyle类
访问Openlayers网站(https://jinuss.github.io/Openlayers_map_pages/,网站是基于Vue3 Openlayers,里面有大量的实践和案例。觉得还不错,可以 给个小星星Star,鼓励一波 https://github.com/Jinuss/OpenlayersMap哦~ 概述 在 Ope…...

解决CentOS9系统下Zabbix 7.2图形中文字符乱码问题
操作系统:CentOS 9 Zabbix版本:Zabbix7.2 问题描述:主机图形中文字符乱码 解决方案: # 安装字体配置和中文语言包 sudo yum install -y fontconfig langpacks-zh_CN.noarch # 检查是否已有中文字体: fc-list :lan…...

AF3 FourierEmbedding类源码解读
FourierEmbedding 是一个用于扩散条件的傅里叶嵌入类,其核心是将输入的时间步噪声强度或控制参数(timestep)转换为高维的周期性特征。 源代码: class FourierEmbedding(nn.Module):"""Fourier embedding for diffusion conditioning."""de…...

vsftpd虚拟用户部署
vsftpd虚拟用户部署 案例提供两个用户如下,使用centos7验证可行。 test *AO9ih&7 ftp DTx4zp_shell脚本运行一键安装vsftp #!/bin/bash yum -y install vsftpd ftp >/etc/vsftpd/vsftpd.conf cat <<EOL >> /etc/vsftpd/vsftpd.conf anonymous_enableNO l…...

MySQL 容器已经停止(但仍然存在),但希望重新启动它,并使它的 3306 端口映射到宿主机的 3306 端口是不可行的
重新启动容器并映射端口是不行的 由于你已经有一个名为 mysql-container 的 MySQL 容器,你可以使用 docker start 启动它。想要让3306 端口映射到宿主机是不行的,实际上,端口映射是在容器启动时指定的。你无法在容器已经创建的情况下直接修改…...

汇编实验·顺序程序设计
一、实验目的: 1.能够熟练的进行顺序程序的编写,掌握基本的汇编语言指令的用法 2.通过程序设计理解掌握不同类型的数据混合运算的基本规则 3.熟练掌握各种寻址方式,深入理解逻辑地址和物理地址的相关概念 二、实验内容 有三个长度分别为1、2、4个字节的数据,编写程序求…...

AIGC视频扩散模型新星:Video 版本的SD模型
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍慕尼黑大学携手 NVIDIA 等共同推出视频生成模型 Video LDMs。NVIDIA 在 AI 领域的卓越成就家喻户晓,而慕尼黑大学同样不容小觑,…...

HarmonyOS:通过(SQLite)关系型数据库实现数据持久化
一、场景介绍 关系型数据库基于SQLite组件,适用于存储包含复杂关系数据的场景,比如一个班级的学生信息,需要包括姓名、学号、各科成绩等,又或者公司的雇员信息,需要包括姓名、工号、职位等,由于数据之间有较…...

10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析
10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析 文章目录 10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析1. 规则持久化1.1 Nacos Server 配置中心-规则持久化实例 2. 最后: 1. 规则持久化 规则没有持久化的问题 如果 sentinel 流控规则没有…...

STM32更新程序OTA
STM32的OTA(Over-The-Air)更新程序是一种通过无线通信方式,为设备分发新软件、配置甚至更新加密密钥的技术。以下是关于STM32 OTA更新程序的详细介绍: 一、OTA升级流程 STM32的OTA升级流程通常包括以下几个关键步骤:…...

MarsCode青训营打卡Day10(2025年1月23日)|稀土掘金-147.寻找独一无二的糖葫芦串、119.游戏队友搜索
资源引用: 147.寻找独一无二的糖葫芦串 119.游戏队友搜索 今日小记: 回乡聚会陪家人,休息一天~ 稀土掘金-147.寻找独一无二的糖葫芦串(147.寻找独一无二的糖葫芦串) 题目分析: 给定n个长度为m的字符串表…...

vue(33) : 安装组件出错解决
1. request to https://registry.npm.taobao.org/semver/download/semver-6.1.1.tgz?cache0&other_urlshttps%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.1.1.tgz failed, reason: certificate has expired 这个错误提示表明你在尝试从https://reg…...

ChatGPT结合Excel辅助学术数据分析详细步骤分享!
目录 一.Excel在学术论文中的作用✔ 二.Excel的提示词✔ 三. 编写 Excel 命令 四. 编写宏 五. 执行复杂的任务 六. 将 ChatGPT 变成有用的 Excel 助手 一.Excel在学术论文中的作用✔ Excel作为一种广泛使用的电子表格软件,在学术论文中可以发挥多种重要作用&a…...

stm32f103 单片机(一)第一个工程
先看一个简单的 系统上已经安装好了keil5 与ARM包,也下载好了STM32固件库 新建一个工程,添加三个组 加入如下文件 在options 里作如下配置 准备在main.c 中写下第一个实验,点亮一个小灯。 像51单片机一样直接对引脚赋值是行不通的 在…...

云计算和服务器
一、云计算概述 ICT是世界电信协会在2001年的全球性会议上提出的综合性概念,ICT分为IT和CT,IT(information technology)信息技术,负责对数据生命周期的管理;CT(communication technology),负责数据的传输管理。 CT技术…...

Spring 框架:配置缓存管理器、注解参数与过期时间
在 Spring 框架中,可通过多种方式配置缓存具体行为,常见配置方法如下。 1. 缓存管理器(CacheManager)配置 基于内存的缓存管理器配置(以SimpleCacheManager为例) SimpleCacheManager 是 Spring 提供的简单…...

Linux系统 C/C++编程基础——基于Qt的图形用户界面编程
ℹ️大家好,我是练小杰,今天周四了,距离除夕只有4天了,各位今年卫生都搞完了吗!😆 本文是接着昨天Linux 系统C/C编程的知识继续讲,基于Qt的图形用户界面编程概念及其命令,后续会不断…...

并发编程 - 线程同步(一)
经过前面对线程的尝试使用,我们对线程的了解又进一步加深了。今天我们继续来深入学习线程的新知识 —— 线程同步。 01、什么是线程同步 线程同步是指在多线程环境下,确保多个线程在同时使用共享资源时不会发生冲突或数据不一致问题的技术,保…...

PyTorch入门 - 为什么选择PyTorch?
PyTorch入门 - 为什么选择PyTorch? Entry to PyTorch - Why PyTorch? by JacksonML $ pip install pytorch安装完毕后,可以使用以下命令,导入第三方库。 $ import pytorch...

leetcode刷题记录(八十六)——84. 柱状图中最大的矩形
(一)问题描述 84. 柱状图中最大的矩形 - 力扣(LeetCode)84. 柱状图中最大的矩形 - 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾…...

Android GLSurfaceView 覆盖其它控件问题 (RK平台)
平台 涉及主控: RK3566 Android: 11/13 问题 在使用GLSurfaceView播放视频的过程中, 增加了一个播放控制面板, 覆盖在视频上方. 默认隐藏setVisibility(View.INVISIBLE);点击屏幕再显示出来. 然而, 在RK3566上这个简单的功能却无法正常工作. 通过缩小视频窗口可以看到, 实际…...

开源鸿蒙开发者社区记录
lava鸿蒙社区可提问 Laval社区 开源鸿蒙项目 OpenHarmony 开源鸿蒙开发者论坛 OpenHarmony 开源鸿蒙开发者论坛...

【Linux网络编程】传输层协议
目录 一,传输层的介绍 二,UDP协议 2-1,UDP的特点 2-2,UDP协议端格式 三,TCP协议 3-1,TCP报文格式 3-2,TCP三次握手 3-3,TCP四次挥手 3-4,滑动窗口 3-5…...

10个非常基础的 Javascript 问题
Javascript是一种用于Web开发的编程语言。JavaScript在网络的客户端上运行。 根据MDN,JavaScript(通常缩写为JS)是一种轻量级的,解释性的,面向对象的语言,具有一流的功能,并且最著名的是Web页面…...