深入解析MVCC中Undo Log版本底层存储读取逻辑

一、引言

多版本并发控制(MVCC,Multi-Version Concurrency Control)是一种广泛应用于关系数据库管理系统中的并发控制技术。它通过保存数据的历史版本,使得在事务并发执行时,每个事务都能看到数据的一致性视图。在MVCC中,Undo Log起着至关重要的作用,本文将详细阐述MVCC的版本控制逻辑以及Undo Log在其中的底层存储读取机制。

二、MVCC版本控制逻辑

  1. 版本生成

在MVCC中,每当数据发生修改时,系统会为修改前的数据生成一个版本。这个版本包含了数据的前映像,即修改前的值。版本号通常是一个递增的序列,用于标识不同版本的数据。

  1. 事务可见性

MVCC通过事务的可见性来判断数据版本是否对当前事务可见。事务的可见性规则如下:

(1)事务读取数据时,只能看到小于等于事务开始时的版本号的数据; (2)事务修改数据时,会生成一个新的版本,版本号大于当前事务的版本号; (3)事务提交后,修改后的数据版本才会对其他事务可见。

  1. 版本链

为了实现数据的多个版本,MVCC采用版本链来组织数据。版本链由多个版本组成,每个版本包含以下信息:

(1)版本号; (2)数据前映像; (3)指向下一个版本的指针。

三、Undo Log底层存储读取逻辑

  1. Undo Log简介

Undo Log是MVCC实现的关键部分,用于在事务回滚时撤销已提交的操作。在数据修改过程中,Undo Log记录了数据的前映像,以便在需要时恢复到修改前的状态。

  1. Undo Log存储结构

Undo Log通常采用以下存储结构:

(1)事务ID:标识修改数据的事务; (2)操作类型:如插入、更新、删除等; (3)数据前映像:修改前的数据值; (4)指向下一个Undo Log的指针。

  1. 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的余额。

  1. 事务T2查找版本链,找到最新版本V2。
  2. 由于版本V2是由事务T1创建的,并且T1尚未提交,事务T2需要根据MVCC的规则找到自己可见的版本。
  3. 事务T2根据Undo Log回溯到版本V1,因为V1是T2开始时存在的版本。

Undo Log读取逻辑

事务T2按照以下步骤读取数据:

  1. 查找版本链,发现最新版本是V2。
  2. 检查版本V2的事务ID,发现是T1。
  3. 由于T1尚未提交,T2不能读取V2。
  4. 查找T1的Undo Log,读取数据前映像1000。
  5. 使用Undo Log中的前映像恢复数据到版本V1的状态。

事务T2读取结果

事务T2读取到的账户余额是1000,因为它只能看到自己开始时存在的数据版本。

事务提交

如果事务T1提交,那么版本V2将对所有新开始的事务可见。此时,如果新的事务T3开始并读取账户余额,它将直接看到版本V2的数据1200。

通过这个例子,我们可以看到MVCC和Undo Log如何协同工作,以确保事务的隔离性和数据的一致性。Undo Log在这里起到了至关重要的作用,它记录了数据修改的历史,使得事务能够在需要时回滚到之前的状态。

四、总结

本文详细阐述了MVCC中Undo Log版本底层存储读取逻辑。通过版本链和Undo Log,MVCC实现了数据的多版本控制,保证了事务的隔离性和一致性。在实际应用中,了解MVCC的底层原理对于优化数据库性能和解决并发问题具有重要意义。

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

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

相关文章

使用c#制作坐标

1、建立坐标 2、坐标系的放大缩小 3、标定刻度 4、实时显示鼠标在坐标系上的坐标 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using S…

计算属性 简写和 完整写法

计算属性渲染不加上括号 methods方法和computed属性区别: computed只计算一次,然后缓存,后续直接拿出来使用,而methods每次使用每次计算,不会缓存 计算属性完整写法: 既获取又设置 slice 截取 成绩案例 …

c++基于过程

前言: 笔记基于C黑马程序员网课视频:黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili 在此发布笔记,只是为方便学习,不做其他用途,原作者为黑马程序员。 1. C基础 1.1 用Visual Studio写C程…

Windows配置cuda,并安装配置Pytorch-GPU版本

文章目录 1. CUDA Toolkit安装2. 安装cuDNN3. 添加环境变量配置Pytorch GPU版本 博主的电脑是Windows11,在安装cuda之前,请先查看pytorch支持的版本,cuda可以向下兼容,但是pytorch不行,请先进入:https://py…

【202】仓库管理系统

-- 基于springboot仓库管理系统设计与实现 开发技术栈: 开发语言 : Java 开发软件 : Eclipse/MyEclipse/IDEA JDK版本 : JDK8 后端技术 : SpringBoot 前端技术 : Vue、Element、HTML、JS、CsS、JQuery 服务器 : Tomcat8/9 管理包 : Maven 数据库 : MySQL5.x/8 数据库工具 : …

Debian安装配置RocketMQ

安装配置 本次安装在/tools/rocket目录下 下载 wget https://dist.apache.org/repos/dist/release/rocketmq/5.3.1/rocketmq-all-5.3.1-bin-release.zip 解压缩 unzip rocketmq-all-5.3.1-bin-release.zip 如果出现以下报错 -bash: unzip: command not found可安装unzip工具后执…

php的zip扩展 先装libzip

【宝塔面板】php7.4 安装 zip 扩展 - PHP笔记网 在CentOS 7系统中,通过【宝塔Linux】安装了PHP7.4,运行业务系统时,报错: 1 it is missing from your system. Install or enable PHPs zip extension. 提示需要php的zip扩展&…

【Java-tesseract】OCR图片文本识别

文章目录 一、需求二、概述三、部署安装四、技术细节五、总结 一、需求 场景需求:是对识别常见的PNG,JPEG,TIFF,GIF图片识别,环境为离线内网。组件要求开源免费,并且可以集成Java生成接口服务。 二、概述 我不做选型对比了,我筛选测试了下Tesseract(v…

【RabbitMQ的死信队列】

死信队列 什么是死信队列死信队列的配置方式死信消息结构 什么是死信队列 消息被消费者确认拒绝。消费者把requeue参数设置为true(false),并且在消费后,向RabbitMQ返回拒绝。channel.basicReject或者channel.basicNack。消息达到预设的TTL时限还一直没有…

使用 Three.js 创建一个 3D 人形机器人仿真系统

引言 在这篇文章中,我们将探讨如何使用 Three.js 创建一个简单但有趣的 3D 人形机器人仿真系统。这个机器人可以通过键盘控制进行行走和转向,并具有基本的动画效果。 技术栈 HTML5Three.jsJavaScript 实现步骤 1. 基础设置 首先,我们需要…

Python大数据可视化:基于python大数据的电脑硬件推荐系统_flask+Hadoop+spider

开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 价格区间界面 用户信息界面 品牌管理 笔记本管理 电脑主机…

修改vue-element-admin,如何连接我们的后端

改哪几个文件就可以连接我们后端 ​​​​​​​ 主要就这四个 main.js,屏蔽这个或者删除 vue-config 最后两个文件改下端口即可 这样基本就能发了,但是还要改下 改成api 然后还要修改request.js 这里改成我们返回的状态码 我讲一个东西很容易就懂了&…

uniapp实现为微信小程序扫一扫的功能

引言 随着微信小程序的快速发展,越来越多的开发者开始关注和学习微信小程序的开发。其中,微信小程序的扫一扫功能是非常常用且实用的功能之一。通过扫描二维码,用户可以获取到相关的信息或者实现特定的功能。 正文 在过去,开发者需要使用微信开发者工具以及相关的开发文档…

UE(虚幻)学习(四) 第一个C++类来控制小球移动来理解蓝图和脚本如何工作

UE5视频看了不少,但基本都是蓝图如何搞,或者改一下属性,理解UE系统现有组件使用的。一直对C脚本和蓝图之间的关系不是很理解,看到一个视频讲的很好,我也做笔记记录一下。 我的环境是UE5.3.2. 创建UE空项目 我们创建…

【Redis】Redis 安装与启动

在实际工作中,大多数企业选择基于 Linux 服务器来部署项目。本文演示如何使用 MobaXterm 远程连接工具,在 CentOS 7 上安装和启动 Redis 服务(三种启动方式,包括默认启动、指定配置启动和开机自启)。在安装之前&#x…

SpringCloudAlibaba实战入门之路由网关Gateway初体验(十一)

Spring Cloud 原先整合 Zuul 作为网关组件,Zuul 由 Netflix 公司提供的,现在已经不维护了。后面 Netflix 公司又出来了一个 Zuul2.0 网关,但由于一直没有发布稳定版本,所以 Spring Cloud 等不及了就自己推出一个网关,已经不打算整合 zuul2.0 了。 一、什么是网关 1、顾明…

【unity c#】深入理解string,以及不同方式构造类与反射的性能测试(基于BenchmarkDotNet)

出这篇文章的主要一个原因就是ai回答的性能差异和实际测试完全不同,比如说是先获取构造函数再构造比Activator.CreateInstance(type)快,实际却相反 对测试结果的评价基于5.0,因为找不到unity6确切使用的net版本,根据c#9推测是net5…

使用RKNN进行YOLOv8人体姿态估计的实战教程:yolov8-pose.onnx转yolov8-pose.rknn+推理全流程

之前文章有提到“YOLOv8的原生模型包含了后处理步骤,其中一些形状超出了RK3588的矩阵计算限制,因此需要对输出层进行一些裁剪”,通过裁剪后得到的onnx能够顺利的进行rknn转换,本文将对转rnkk过程,以及相应的后处理进行阐述。并在文末附上全部源码、数据、模型的百度云盘链…

C# OpenCV机器视觉:凸包检测

在一个看似平常却又暗藏玄机的午后,阿强正悠闲地坐在实验室里,翘着二郎腿,哼着小曲儿,美滋滋地品尝着手中那杯热气腾腾的咖啡,仿佛整个世界都与他无关。突然,实验室的门 “砰” 的一声被撞开,小…

【JavaEE进阶】@RequestMapping注解

目录 📕前言 🌴项目准备 🌲建立连接 🚩RequestMapping注解 🚩RequestMapping 注解介绍 🎄RequestMapping是GET还是POST请求? 🚩通过Fiddler查看 🚩Postman查看 …