深入解析MVCC中Undo Log版本底层存储读取逻辑
一、引言
多版本并发控制(MVCC,Multi-Version Concurrency Control)是一种广泛应用于关系数据库管理系统中的并发控制技术。它通过保存数据的历史版本,使得在事务并发执行时,每个事务都能看到数据的一致性视图。在MVCC中,Undo Log起着至关重要的作用,本文将详细阐述MVCC的版本控制逻辑以及Undo Log在其中的底层存储读取机制。
二、MVCC版本控制逻辑
- 版本生成
在MVCC中,每当数据发生修改时,系统会为修改前的数据生成一个版本。这个版本包含了数据的前映像,即修改前的值。版本号通常是一个递增的序列,用于标识不同版本的数据。
- 事务可见性
MVCC通过事务的可见性来判断数据版本是否对当前事务可见。事务的可见性规则如下:
(1)事务读取数据时,只能看到小于等于事务开始时的版本号的数据; (2)事务修改数据时,会生成一个新的版本,版本号大于当前事务的版本号; (3)事务提交后,修改后的数据版本才会对其他事务可见。
- 版本链
为了实现数据的多个版本,MVCC采用版本链来组织数据。版本链由多个版本组成,每个版本包含以下信息:
(1)版本号; (2)数据前映像; (3)指向下一个版本的指针。
三、Undo Log底层存储读取逻辑
- Undo Log简介
Undo Log是MVCC实现的关键部分,用于在事务回滚时撤销已提交的操作。在数据修改过程中,Undo Log记录了数据的前映像,以便在需要时恢复到修改前的状态。
- Undo Log存储结构
Undo Log通常采用以下存储结构:
(1)事务ID:标识修改数据的事务; (2)操作类型:如插入、更新、删除等; (3)数据前映像:修改前的数据值; (4)指向下一个Undo Log的指针。
- Undo Log读取逻辑
(1)当事务需要读取数据时,首先从版本链中找到符合可见性规则的最新版本; (2)如果找到的版本是由当前事务修改的,则直接读取该版本的数据; (3)如果找到的版本是由其他事务修改的,则需要根据Undo Log回溯到符合可见性规则的版本; (4)从Undo Log中读取数据前映像,恢复到修改前的状态; (5)返回恢复后的数据给事务。
假设我们有一个简单的银行账户表,其中包含账户ID和余额两个字段。我们将通过一个事务更新账户余额,并在这个过程中展示MVCC和Undo Log是如何工作的。
初始状态
账户表:
账户ID | 余额
-------|------
1 | 1000
事务开始
假设事务T1开始,并打算将账户1的余额增加200。
版本生成
在MVCC中,当事务T1尝试修改余额时,系统会为当前余额生成一个版本(版本号V1),并记录Undo Log。
账户表(版本链):
账户ID | 余额 | 版本号 | Undo Log
-------|------|--------|---------
1 | 1000 | V1 | 无
Undo Log(存储结构):
事务ID | 操作类型 | 数据前映像 | 指向下一个Undo Log的指针
-------|---------|-----------|---------------------
T1 | 更新 | 1000 | NULL
事务修改数据
事务T1将余额从1000增加到1200,并生成新版本(版本号V2)。
账户表(版本链):
账户ID | 余额 | 版本号 | Undo Log
-------|------|--------|---------
1 | 1200 | V2 | 指向T1的Undo Log
Undo Log(存储结构):
事务ID | 操作类型 | 数据前映像 | 指向下一个Undo Log的指针
-------|---------|-----------|---------------------
T1 | 更新 | 1000 | NULL
事务读取数据
现在,假设有另一个事务T2开始,并尝试读取账户1的余额。
- 事务T2查找版本链,找到最新版本V2。
- 由于版本V2是由事务T1创建的,并且T1尚未提交,事务T2需要根据MVCC的规则找到自己可见的版本。
- 事务T2根据Undo Log回溯到版本V1,因为V1是T2开始时存在的版本。
Undo Log读取逻辑
事务T2按照以下步骤读取数据:
- 查找版本链,发现最新版本是V2。
- 检查版本V2的事务ID,发现是T1。
- 由于T1尚未提交,T2不能读取V2。
- 查找T1的Undo Log,读取数据前映像1000。
- 使用Undo Log中的前映像恢复数据到版本V1的状态。
事务T2读取结果
事务T2读取到的账户余额是1000,因为它只能看到自己开始时存在的数据版本。
事务提交
如果事务T1提交,那么版本V2将对所有新开始的事务可见。此时,如果新的事务T3开始并读取账户余额,它将直接看到版本V2的数据1200。
通过这个例子,我们可以看到MVCC和Undo Log如何协同工作,以确保事务的隔离性和数据的一致性。Undo Log在这里起到了至关重要的作用,它记录了数据修改的历史,使得事务能够在需要时回滚到之前的状态。
四、总结
本文详细阐述了MVCC中Undo Log版本底层存储读取逻辑。通过版本链和Undo Log,MVCC实现了数据的多版本控制,保证了事务的隔离性和一致性。在实际应用中,了解MVCC的底层原理对于优化数据库性能和解决并发问题具有重要意义。
相关文章:
深入解析MVCC中Undo Log版本底层存储读取逻辑
一、引言 多版本并发控制(MVCC,Multi-Version Concurrency Control)是一种广泛应用于关系数据库管理系统中的并发控制技术。它通过保存数据的历史版本,使得在事务并发执行时,每个事务都能看到数据的一致性视图。在MVC…...
游戏引擎学习第64天
代码改的我看的比较懵 原视频可以去这个网站去看 https://guide.handmadehero.org/ 回顾我们在模拟区域方面的进展 在目前的情况下,如果有很多任务需要完成,可以进行分解。在昨天收到的改变中,决定将任务分解成模拟区域。模拟区域是可以随时…...
Effective C++ 条款33:避免遮掩继承而来的名称
文章目录 条款33:避免遮掩继承而来的名称为什么避免遮掩?如何避免遮掩?1. 使用 using 声明式2. 使用转交函数 (Forwarding Functions) 总结 条款33:避免遮掩继承而来的名称 在 C 中,派生类(derived class&…...
UEFI Spec 学习笔记---4 - EFI System Table(1)
4 - EFI System Table 本章节主要介绍的是 UEFI Image 的 Entry point(在 UEFI 固件执行的时候,都是直接调用入口函数并且执行从而调用其他的 driver)。 UEFI Image 主要是有三类:UEFI boot service driver、UEFI runtime drive…...
【微信小程序】3|首页搜索框 | 我的咖啡店-综合实训
首页-搜索框-跳转 引言 在微信小程序中,首页的搜索框是用户交互的重要入口。本文将通过“我的咖啡店”小程序的首页搜索框实现,详细介绍如何在微信小程序中创建和处理搜索框的交互。 1. 搜索函数实现 onClickInput函数在用户点击搜索框时触发&#x…...
独一无二,万字详谈——Linux之文件管理
Linux文件部分的学习,有这一篇的博客足矣! 目录 一、文件的命名规则 1、可以使用哪些字符? 2、文件名的长度 3、Linux文件名的大小写 4、Linux文件扩展名 二、文件管理命令 1、目录的创建/删除 (1)、目录的创建 ① mkdir…...
React:前端开发领域的璀璨之星
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...
C/C++ 数据结构与算法【哈夫曼树】 哈夫曼树详细解析【日常学习,考研必备】带图+详细代码
哈夫曼树(最优二叉树) 1)基础概念 **路径:**从树中一个结点到另一个结点之间的分支构成这两个结点间的路径。 **结点的路径长度:**两结点间路径上的分支数。 **树的路径长度:**从树根到每一个结点的路径…...
基于NodeMCU的物联网窗帘控制系统设计
最终效果 基于NodeMCU的物联网窗帘控制系统设计 项目介绍 该项目是“物联网实验室监测控制系统设计(仿智能家居)”项目中的“家电控制设计”中的“窗帘控制”子项目,最前者还包括“物联网设计”、“环境监测设计”、“门禁系统设计计”和“小…...
喜报 | 擎创科技入围上海市优秀信创解决方案
近日,由上海市经信委组织的“2024年上海市优秀信创解决方案”征集遴选活动圆满落幕,擎创科技凭借实践经验优秀的《擎创夏洛克智能预警与应急处置解决方案》成功入选“2024年上海市优秀信创解决方案”名单。 为激发创新活力,发挥标杆作用&…...
windows10下使用沙盒多开uiautoanimation可行性验证
文章目录 ⭐前言⭐sandboxie下载使用⭐pyinstaller打包python的uiautoanimation成exe⭐结论⭐结束 ⭐前言 大家好,我是yma16,本文分享windows下使用沙盒多开uiautoanimation可行性验证。 背景 实现多开应用程序从而进行自动化控制,批量处理大…...
电脑报错wsdprintproxy.dll丢失?修复wsdprintproxy.dll文件缺失的实用方法
在使用电脑的过程中,我们可能会遇到各种各样的错误提示,其中之一就是系统提示wsdprintproxy.dll文件丢失。这个DLL文件是Windows操作系统中的一个重要组件,它通常与Windows的打印功能相关。当这个文件丢失或损坏时,可能会导致打印…...
Kubernetes 的资源管理方式
集群架构 Docker 是每一个节点(包括 Master 节点和 Node 节点)的运行时环境。 kubelet 负责控制所有容器的启动和停止等,保证每个节点(包括 Master 节点和 Node 节点)正常工作,并且帮助 Node 节点和 Maste…...
layui动态拼接生成下拉框验证必填项失效问题
利用 jQuery 动态拼接下拉框时,lay-verify"required" 失效了,有以下几种原因。 1. <form></form>标签 加入 layui 类,class"layui-form" 。提交按钮上加自动提交,lay-submit ""; 。需…...
VUE3+VITE简单的跨域代理配置
出于安全考虑,未设置前端白名单,前端开发时,需要配置代理。 在本地创建一个虚拟服务器,发送请求数据,同时接受请求的数据, 利用服务器与服务器间,交互,不会有跨域问题,也…...
Xdebug
1、开启xdebug扩展 2、修改一下php.ini文件 xdebug.remote_enable 1 xdebug.remote_autostart 13、vscode安装插件php debug 4、生成launch.json文件,好像啥都不用改 5、vscode没有配置php路径的,需要去配置: 6、发起请求 8、代码断…...
IDEA | SpringBoot 项目中使用 Apifox 上传接口
目录 1 安装 Apifox Helper 插件2 获取 Apifox 的 API 访问令牌3 IDEA 中设置 API 访问令牌4 IDEA 中上传接口5 常见问题5.1 如何自动设置目录名5.2 如何自动设置接口名5.3 如何更改上传位置 Apifox 官方指南: https://apifox.com/help/applications-and-p…...
列表分页返回对象
列表分页返回对象 仅针对于新项目,因为一般进入公司后项目都是已经搭建好的,只需要在原有框架基础上操作就可以了,但是遇到从0开始的项目并且还没有架构需要自己搭框架的时候就需要自己想办法找各种封装格式。 下面记录分页列表返回的封装格式…...
微软edge浏览器 v131.0.2903.99便携版
前言 Microsoft Edge浏览器是个新浏览器,它用起来很简单,界面也很清爽。这个浏览器功能特别多,里面还带了微软的小助手Contana,能帮用户做不少贴心的事儿。它支持安装各种小工具(插件),还能在网…...
Prometheus 专栏 —— Prometheus入门介绍
Prometheus 是? Prometheus 是一个开源的服务监控系统和时序数据库,主要用于收集、存储、查询和告警时间序列数据,这些数据通常反映了系统或者应用的状态或性能 Prometheus 的基本功能是? 数据采集数据存储数据查询告警通知 Prometheus 监控核心组件?…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
