多版本并发控制: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单片机一样直接对引脚赋值是行不通的 在…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
