事务原理,以及MVCC如何实现RC,RR隔离级别的

news2024/11/18 15:23:26

事务原理

 redo log 保持持久性:

首先原来的情况是我们做一组操作的时候,先去操作bufferpool缓冲区,如果没有,那么后台线程将数据页换入换出到缓冲区,然后我们对这个buffer pool进行修改,为脏页,在写回磁盘的时候宕机了,那么不能保证持久性了,所以引出了redolog

redo log 在这里出现就是将更新的操作立马更新到redologbuffer中,然后等事务提交的时候,那么直接将redologbuffer的文件写回追加到磁盘的 log文件中,实现持久化。这样下次bufferpool中的脏页写回也不担心宕机了

undo log实现原子性

undolog记录的是逻辑日志,redolog记录的是物理日志;

实现原子性就是,当我们delete一条数据的时候,undolog会存有对应的一条insert数据,当执行rollback的时候,就可以从undolog中读取相应的内容进行回滚;保证原子性

mvcc和锁实现隔离性

基本概念:

当前读:执行当前读的时候,读取的是最新的数据版本;

快照读:就是事务读取的是事务开始的版本,有可能是旧版本,RR级别就是这个快照读

原来的两个事务其中一个修改了表的数据,然后另一个是读取不到的,因为事务的隔离级别为RR可重复读,然后我们加了个共享锁,或者是一下排他锁就变成了当前读,就可以读到最新的版本数据了

MVCC:

隐藏字段:事务id,回滚指针(指向上一个版本的事务),隐藏主键

undo log

readview

读已提交的隔离级别:每次执行快照读的时候生成Readview;

可重复读:仅在第一次执行快照读时生成readview,后续都用这个Readview;

MVCC实现原理:

1. 隐藏字段

每一行记录在数据库中(如MySQL InnoDB)都有两个隐藏字段:

  • trx_id(创建事务ID):记录该行是由哪个事务插入或更新的,用于标识哪个事务创建或修改了这个版本的数据。
  • roll_pointer(指向undo log):指向undo log中的前一个版本的记录,形成一个版本链。

这两个字段帮助维护数据的多个版本,在读取时通过这些字段判断数据版本是否可见。

2. undo log版本链

每次对数据行进行更新操作时,并不会直接覆盖数据,而是将旧版本数据保存在undo log中,并且利用roll_pointer指向前一个版本的数据,形成一个版本链。这些旧版本数据存储在undo log中,并可以通过回滚操作恢复或者进行历史版本读取。

undo log版本链允许在并发事务中查询过去某个时刻的数据库状态,而不影响当前正在进行的事务。每个事务可以通过遍历这个版本链来找到符合其可见性规则的数据版本。

3. readview

readview是MVCC在执行查询时创建的一致性视图,它用于决定当前事务能够看到哪些数据版本。readview中保存了当前正在活跃的事务列表,以及当前事务的ID。这个视图确定了当前事务可以看到哪些数据版本,避免读取到其他未提交事务的更改。

关系:
  • trx_id记录了数据的创建时间(以事务为单位),可以通过它来判断某个版本的数据是否是当前事务或其他事务创建的。
  • undo log版本链用于保存历史版本,并通过roll_pointer串联成链,回溯出需要的历史数据版本。
  • readview则是事务在执行查询时生成的,帮助决定当前事务可以看到哪些版本的记录。

MVCC如何实现隔离级别

1. 可重复读(Repeatable Read)

可重复读隔离级别下,数据库为每个事务生成一个固定的readview,该视图在事务开始时创建,并在整个事务期间保持不变。通过readview的规则,每次查询时事务都只会看到在事务开始时已经提交的版本。

具体流程:

  • 当事务开始时,系统生成一个readview,记录当前系统中活跃的事务ID列表。
  • 读取数据时,通过遍历undo log版本链,根据数据的trx_id判断当前事务是否能看到某个版本:
    • 如果数据的trx_id小于当前readview生成时的最小活跃事务ID(即数据在事务开始前已经提交),则该版本可见。
    • 如果数据的trx_id大于当前readview中的最大事务ID,说明这个版本是在当前事务之后创建的,不可见。
    • 如果trx_id在活跃事务列表中,说明该事务还未提交,数据不可见。
  • undo log中的每个版本根据以上规则遍历,找到第一个可见的版本进行返回。

通过这种机制,即使其他事务在当前事务执行期间对数据做了修改,当前事务也只会读取到事务开始时的数据版本,实现了可重复读

2. 读已提交(Read Committed)

读已提交隔离级别下,数据库在每次执行SELECT语句时都会生成一个新的readview。这意味着,每次查询都会看到最近已经提交的版本数据,而不必像可重复读那样锁定在事务开始时的版本。

具体流程:

  • 在每次查询时,数据库生成一个新的readview,包含当前活跃的事务ID列表。
  • 根据与可重复读相同的判断规则,遍历undo log版本链,查找当前readview下可见的数据版本。
  • 因为readview是每次查询都生成的,因此每次查询都会看到最新已提交的数据,从而允许事务在执行期间读取到其他事务已经提交的更新数据。

总结:

  • 隐藏字段存储了记录的事务ID和回滚指针,决定了当前版本的记录由哪个事务修改,并提供了回溯历史版本的路径。
  • Undo Log 记录了历史版本数据,并通过 roll_pointer 构建版本链,确保事务可以基于不同的 ReadView 回溯到合适的历史版本。
  • ReadView 决定了当前事务在读取时能看到哪些事务提交的版本数据。在 可重复读 下,ReadView 在事务启动时生成并固定,而在 读已提交 下,每次读取都会创建新的 ReadView。

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

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

相关文章

Redis篇(Redis原理 - 数据结构)(持续更新迭代)

目录 一、动态字符串 二、intset 三、Dict 1. 简介 2. Dict的扩容 3. Dict的rehash 4. 知识小结 四、ZipList 1. 简介 2. ZipListEntry 3. Encoding编码 五、ZipList的连锁更新问题 六、QuickList 七、SkipList 八、RedisObject 1. 什么是 redisObject 2. Redi…

开放式耳机哪个品牌好?2024年蓝牙耳机排行榜

开放式蓝牙耳机以其独树一帜的佩戴方式,正逐渐成为音乐爱好者和运动达人的新宠。时尚而又实用。如果你对传统耳机的佩戴方式感到厌倦,或者在寻找一款既能提供高品质音乐体验又能兼顾佩戴舒适性的耳机,那么开放式蓝牙耳机可能会是你的理想选择…

Vue3轻松实现前端打印功能

文章目录 1.前言2.安装配置2.1 下载安装2.2 main.js 全局配置3.综合案例3.1 设置打印区域3.2 绑定打印事件3.3 完整代码4.避坑4.1 打印表格无边框4.2 单选框复选框打印不选中4.3 去除页脚页眉4.4 打印內容不自动换行1.前言 vue3 前端打印功能主要通过插件来实现。 市面上常用的…

【CKA】八、扩容Deployment

8、扩容Deployment 1. 考题内容: 2. 答题思路: 直接使用命令扩容就行 我考的题只是把 loadbalancer 名字换了 ,其他都一模一样 3. 官网地址: https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/ …

Golang | Leetcode Golang题解之第451题根据字符出现频率排序

题目: 题解: func frequencySort(s string) string {cnt : map[byte]int{}maxFreq : 0for i : range s {cnt[s[i]]maxFreq max(maxFreq, cnt[s[i]])}buckets : make([][]byte, maxFreq1)for ch, c : range cnt {buckets[c] append(buckets[c], ch)}an…

【AI大模型】深入Transformer架构:编码器部分的实现与解析(上)

目录 🍔 编码器介绍 🍔 掩码张量 2.1 掩码张量介绍 2.2 掩码张量的作用 2.3 生成掩码张量的代码分析 2.4 掩码张量的可视化 2.5 掩码张量总结 🍔 注意力机制 3.1 注意力计算规则的代码分析 3.2 带有mask的输入参数: 3.…

华为开源自研AI框架昇思MindSpore应用案例:计算高效的卷积模型ShuffleNet

如果你对MindSpore感兴趣,可以关注昇思MindSpore社区 ShuffleNet ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型,和MobileNet, SqueezeNet等一样主要应用在移动端,所以模型的设计目标就是利用有限的计算资源来达到…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于节点碳势响应的新型电力系统鲁棒优化调度 》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

生信初学者教程(二十二):Boruta+RF筛选候选标记物

文章目录 介绍加载R包导入数据准备数据机器学习特征筛选数据分割基础模型Boruta特征筛选调参最终分类模型测试集验证标记基因输出结果总结介绍 采用了Boruta结合 RF(Random Forest) 的方法,对差异基因(参考 @sec-different-limma) 进行了特征筛选。通过这种方法,能够从大…

你以为瀑布流布局很复杂?Vue-Waterfall让你秒变前端高手

你以为瀑布流布局很复杂?Vue-Waterfall让你秒变前端高手 Vue-Waterfall 是一个轻量级的 Vue.js 组件,专为实现灵活的瀑布流布局设计。如果你需要在页面上呈现动态、响应式的布局,那这个组件绝对能帮到你!本文将带你快速了解这个组…

推荐 uniapp 相对好用的海报生成插件

插件地址:自定义canvas样式海报 - DCloud 插件市场 兼容性也是不错的:

微软准备了 Windows 11 24H2 ISO “OOBE/BypassNRO“命令依然可用

Windows 11 24H2 可能在未来几周内开始推出。 微软已经要求 OEM 遵循新的指南准备好 Windows 11 24H2 就绪的驱动程序,并且现在已经开始准备媒体文件 (.ISO)。 OEM ISO 的链接已在微软服务器上发布。 一个标有"X23-81971_26100.1742.240906-0331.ge_release_sv…

[Python学习日记-35] Python 中的内置函数(上)

[Python学习日记-35] Python 中的内置函数(上) 简介 内置函数详解(A-E) 简介 在 Python 中有很多内置函数,例如 len(),这些函数是 Python 解释器自带的,可以直接使用。本篇将介绍 A-H 的内置函…

基于Springboot+Vue的《计算机基础》网上考试系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

YOLOv11:重新定义实时目标检测的未来

YOLO 版本发布历史回顾 YOLO (You Only Look Once), a popular object detection and image segmentation model, was developed by Joseph Redmon and Ali Farhadi at the University of Washington. Launched in 2015, YOLO quickly gained popularity for its high speed a…

vulnhub-mrRobot靶机的测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、渗透网页 3、Getshell 4、提权 四、结论 一、测试环境 1、系统环境 渗透机:kali2021.1(192.168.202.134) 靶 机:linux 3.13.0-55-generic #94-…

复习HTML(基础)

目录 HTML含义 HTML作用 HTML的常用元素 元素的特点 元素的分类 1 是否嵌套关系 2 是否独占一行 块元素:独占一行 行内元素:共享一行 行内元素与块级元素的转换 3是否有结束标签 常用标签 1 标题标签:有六级 我们用h1 ~h6 表…

国产化系统/鸿蒙开发足浴店收银源码-收缩左侧———未来之窗行业应用跨平台架构

一、左侧展开后 二、代码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head><title></title><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><style t…

PHP安装后Apache无法运行的问题

问题 按照网上教程php安装点击跳转教程&#xff0c;然后修改Apache的httpd.conf文件&#xff0c;本来可以运行的Apache&#xff0c;无法运行了 然后在"C:\httpd-2.4.62-240904-win64-VS17\Apache24\logs\error.log"&#xff08;就是我下载Apache的目录下的logs中&am…

查看 git log的过程中看到 :说明日志输出可能超出屏幕大小,系统进入了分页模式

在命令行提示符中&#xff0c;通常 : 表示系统等待进一步的输入。如果你在查看 git log 的过程中看到 :&#xff0c;说明日志输出可能超出屏幕大小&#xff0c;系统进入了分页模式&#xff0c;默认使用 less 命令查看内容。 此时你可以&#xff1a; 按 q 退出日志查看。按 En…