undolog

news2025/1/13 17:27:19

一、原子性

ACID:通过undolog保证原子性

二、undolog 如何做

把回滚时所需的东西都给记下来:
1、插入一条记录时,至少要把这条记录的主键值记下来,回滚的时候只需要把这个主键值对应的记录删掉就好了。 
2、删除了一条记录,至少要把这条记录中的内容都记下来,回滚时再把由这些内容组成的记录插入 到表中就好了。 
2、修改了一条记录,至少要把修改这条记录前的旧值都记录下来,回滚时再把这条记录更新为旧值 就好了。

三、事务id

3.1 分配事务id时机

        某个事务执行过程中对某个表执行了增、删、改操作,那么 InnoDB 存储引擎就会给它分配一个独一无二的 事务id,如果只有读请求则不会分配事务id

3.2 事务id如何生成

1、服务器会在内存中维护一个全局变量,每当需要为某个事务分配一个 事务id 时,就会把该变量的值当作 事 务id 分配给该事务,并且把该变量自增1。
2、每当这个变量的值为 256 的倍数时,就会将该变量的值刷新到系统表空间的页号为 5 的页面中一个称之为 Max Trx ID 的属性处,这个属性占用 8 个字节的存储空间。
3、当系统下一次重新启动时,将上边提到的 Max Trx ID 属性加载到内存,该值加上256之后赋值给我们 前边提到的全局变量(因为在上次关机时该全局变量的值可能大于 Max Trx ID 属性值)。
***保证整个系统中分配的事务id是一个递增的数字。先被分配 id 的事务得到的是较小的事务id , 后被分配 id 的事务得到的是较大的 事务id 。***

3.3 trx_id隐藏列

trx_id 列其实还蛮好理解的,就是某个对这个聚簇索引记录做改动的语句所在的事务对应的 事务id 而已 (此处的改动可以是 INSERT 、 DELETE 、 UPDATE 操作)。

四、undo日志的格式 

4.1 insert对应的undolog

4.1.1 undolog日志结构

插入一条记录时有 乐观插入悲观插入 区分,对应TRX_UNDO_INSERT_REC 类型的undolog

 4.2.2 undolog记录实例

1、执行两个insert语句:

INSERT INTO undo_demo(id, key1, col) VALUES (1, 'AWM', '狙击枪'), (2, 'M416', '步枪');

2、第一条 undo日志 的 undo no 为 0 ,记录主键占用的存储空间长度为 4 ,真实值为 1 。画一个示意图就是 这样:

3、第二条undo日志 的 undo no 为 1 ,记录主键占用的存储空间长度为 4 ,真实值为 2 。画一个示意图就是 这样(与第一条 undo日志 对比, undo no 和主键各列信息有不同): 

4.2 DELETE对应的undo log

4.2.1 删除操作数据结构

Page Header 部分有一个称之为 PAGE_FREE 的属性,被删除的记录其实也会根据记录头信息中的 next_record 属性组成一个链表,只不过这个链表中的记录占用的存储空间可以被重新利用,所以也称这个链表 为 垃圾链表。

4.2.2 删除操作2个阶段 

1、阶段一:delete mark:仅仅将记录的 delete_mask 标识位设置为 1 ,其他的不做修改(其实会修改记录的 trx_id 、 roll_pointer 这些隐藏列的值),是一个 中间状态。

2、阶段二:purge 删除语句事务提交,有专门的线程后来真正的把记录删除掉。就 是把该记录从 正常记录链表 中移除,并且加入到 垃圾链表 中,还要调整一些页面的其他信息,比如页 面中的用户记录数量 PAGE_N_RECS 、上次插入记录的位置 PAGE_LAST_INSERT 、垃圾链表头节点的指针 PAGE_FREE 、页面中可重用的字节数量 PAGE_GARBAGE 、还有页目录的一些信息。

3、阶段二执行完成

将被删除记录加入到 垃圾链表 时,实际上加入到链表的头节点处,会跟着修改 PAGE_FREE 值。

4.2.3 删除操作日志结构

对应TRX_UNDO_DEL_MARK_REC类型的undolog,结构如下:

4.2.4 版本链

在对一条记录进行 delete mark 操作前,需要把该记录的旧的 trx_id 和 roll_pointer 隐藏列的值都给记 到对应的 undo日志 中来,对应图中的 old trx_id 和 old roll_pointer 属性。可以通过 undo日志 的 old roll_pointer 找到记录在修改之前对应的 undo 日志。比方说在一个事务 中,我们先插入了一条记录,然后又执行对该记录的删除操作,这个过程的示意图就是这样:

从图中可以看出来,执行完 delete mark 操作后,它对应的 undo log和 INSERT 操作对应的 undo 日志就串 成了一个链表。这个链表就称之为 版本链。

4.2.5 删除实例

BEGIN; # 显式开启一个事务,假设该事务的id为100
# 插入两条记录
INSERT INTO undo_demo(id, key1, col)
 VALUES (1, 'AWM', '狙击枪'), (2, 'M416', '步枪');
# 删除一条记录
DELETE FROM undo_demo WHERE id = 1;

这个 delete mark 操作对应的 undo日志 的结构就是这样: 


1、这条 undo 日志是 id 为 100 的事务中产生的第3条 undo 日志,所以它对应的 undo no 是 2 。 
2、在对记录做 delete mark 操作时,记录的 trx_id 隐藏列的值是 100 (也就是说对该记录最近的一次修改就 发生在本事务中),所以把 100 填入 old trx_id 属性中。然后把记录的 roll_pointer 隐藏列的值取出 来,填入 old roll_pointer 属性中,这样就可以通过 old roll_pointer 属性值找到最近一次对该记录做改 动时产生的 undo日志 。 
3、由于 undo_demo 表中有2个索引:一个是聚簇索引,一个是二级索引 idx_key1 。只要是包含在索引中的列,那么这个列在记录中的位置( pos ),占用存储空间大小( len )和实际值( value )就需要存储到 undo日志 中。 
    对于主键来说,只包含一个 id 列,存储到 undo日志 中的相关信息分别是:
    pos:id 列是主键,在记录的第一个列,它对应的 pos 值为 0 。 pos 占用1个字节来存储。 
    len : id 列的类型为 INT ,占用4个字节,所以 len 的值为 4 。 len 占用1个字节来存储。 
    value :在被删除的记录中 id 列的值为 1 ,也就是 value 的值为 1 。 value占用4个字节来存储。 画一个图演示一下就是这样:

 

对于 id 列来说,最终存储的结果是 ,存储这些信息占用的存储空间大小为 1 + 1 + 4 = 6 个字节。
对于 idx_key1 来说,只包含一个 key1 列,存储到 undo日志 中的相关信息分别是: 
    pos : key1 列是排在 id 列、 trx_id 列、 roll_pointer 列之后的,它对应的 pos 值为 3 。 pos 占用1个字节来存储。 
    len : key1 列的类型为 VARCHAR(100) ,使用 utf8 字符集,被删除的记录实际存储的内容是 AWM ,所以一共占用3个字节,也就是所以 len 的值为 3 。 len 占用1个字节来存储。 
    value :在被删除的记录中 key1 列的值为 AWM ,也就是 value 的值为 AWM 。 value 占用3个字节 来存储。

 key1 列来说,最终存储的结果是 ,存储这些信息占用的存储空间大小 为 1 + 1 + 3 = 5 个字节。

<0, 4, 1> 和 <3, 3, 'AWM'> 和 共占用 11 个字节。然后 index_col_info len 本身占用 2 个字节,所以加起来一共占用 13 个字节,把数字 13 就填到了 index_col_info len 的 属性中。

4.2 roll pointer隐藏列的含义

占用 7 个字节的字段,本质上就是一个指向记录对应的 undo日志的指针 。

数据记录被存储到了类型为 FIL_PAGE_INDEX 的页面中(就是我们前边一直所说的 数据页 ), undo日志 被存放到了类型为 FIL_PAGE_UNDO_LOG 的页面中。

 

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

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

相关文章

10 行代码能做什么?

10 行代码能做什么&#xff1f; 写一串 SQL Join&#xff0c;统计全渠道市场营销的 ROI 用 JS 画个饼图&#xff0c;展示最有效的广告投放策略 用 Python 写段算法&#xff0c;分析销量骤降的原因是什么 …… 数据出错了&#xff0c;写个对数脚本 -_-|| AI 时代&#xff0c;…

AI图像行为分析算法 opencv

AI图像行为分析算法通过pythonopencv深度学习框架对现场操作行为进行全程实时分析&#xff0c;AI图像行为分析算法通过人工智能视觉能够准确判断出现场人员的作业行为是否符合SOP流程规定&#xff0c;并对违规操作行为进行自动抓拍告警。OpenCV是一个基于Apache2.0许可&#xf…

管理类联考——逻辑——汇总篇——知识点突破——形式逻辑——联言选言——定义

角度——本质定义 联言 联言命题是断定两种或两种以上事物情况同时存在的命题&#xff0c;用“A并且B”表示&#xff0c;逻辑符号为A ∧ B。 若“A ∧ B”为真&#xff0c;表明A是真的&#xff0c;同时B也是真的。 【定义】联言命题是表示若干判断同时成立的命题。 【刻画】…

Java与其他编程语言比较分析,编程语言选择与优点、缺点和适用场景详解

原文地址&#xff1a;Java与其他编程语言比较分析&#xff0c;编程语言选择与优点、缺点和适用场景详解 Java 擅长可移植性和可靠性&#xff0c;Python 擅长通用性和简单性&#xff0c;JavaScript 擅长 Web 开发&#xff0c;C 擅长性能&#xff0c;Go 擅长效率。网址:yii666.c…

网御星云-上网行为管理系统bottomframe.cgi接口存在SQL注入

一、免责声明&#xff1a; 本次文章仅限个人学习使用&#xff0c;如有非法用途均与作者无关&#xff0c;且行且珍惜&#xff1b;由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;公众号望雪阁及作者不为此…

OS 内存使用和分段

磁盘很大但是内存很小&#xff0c;当进程一堵塞的时候&#xff0c;就把进程一放入磁盘&#xff0c;然后进程二进去。进程三睡眠的时候在把二和三交换&#xff0c;所以载入之后重定位不太行 GDT是整个操作系统的段表&#xff0c;多个进程的 LDT时某个进程的段表

SpringBoot 博客网站

SpringBoot 博客网站 系统功能 登录注册 博客列表展示 搜索 分类 个人中心 文章分类管理 我的文章管理 发布文章 开发环境和技术 开发语言&#xff1a;Java 使用框架: SpringBoot jpa H2 Spring Boot是一个用于构建Java应用程序的开源框架&#xff0c;它是Spring框架的一…

Spring版本与JDK版本演变

Java各版本变更核心API Java8 lambada表达式函数式接口方法引用默认方法Stream API 对元素流进行函数式操作Optional 解决NullPointerExceptionDate Time API重复注解 RepeatableBase64使用元空间Metaspace代替持久代&#xff08;PermGen space&#xff09; Java7 switch 支…

哈希表与有序表

哈希表与有序表 Set结构 key Map结构 key-value 哈希表 哈希表的时间复杂度都是常数项级别的&#xff0c;但常数较大 增删改查的时间都是常数级别的&#xff0c;与数据量无关 当哈希表存储的值是基础数据类型&#xff08;Integer - int&#xff09;&#xff0c;哈希表中内…

第6讲:利用VBA获得指定行、列中最后一个非空单元格

【分享成果&#xff0c;随喜正能量】修行佛法从哪儿下手呢&#xff1f;要从信心下手。佛法大海&#xff0c;唯信能入。三皈依就是世间获得吉祥如意&#xff0c;出世间获得究竟解脱的正因&#xff0c;慎勿退失&#xff0c;谨守修行。。 《VBA代码解决方案》(10028096)这套教程是…

一种改进多旋翼无人机动态仿真的模块化仿真环境研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

详细的SAP的付款条件测试

详细的SAP的付款条件测试 正好需要看一个清账日期的问题&#xff0c;然后重新理了一下付款条件&#xff0c;特此记录&#xff0c;省的后面每次都要捋一遍。其实真正能做到按照条件付款的良心企业很少。 付款条件修改事务码&#xff1a;OBB8 1、凭证日期作为基准&#xff0c;…

迅镭激光大幅面光纤激光切割机中标全球最大航运企业中国远洋海运!

征程万里阔&#xff0c;奋斗正当时! 今年以来&#xff0c;迅镭激光锚定战略目标&#xff0c; 坚持以市场为导向&#xff0c;稳中求进、守正创新&#xff0c; 各业务板块持续发力&#xff0c;频频中标多个行业龙头企业! 近日&#xff0c;公司再次传来好消息&#xff0c;中标全球…

存储型XSS获取网站后台

首先&#xff0c;在XSS平台获取一个地址 将XSS代码存在可能存在XSS漏洞的留言框 管理员登录和查看留言信息即会触发XSS 然后就可以利用cookie直接进入后台

JavaScript页面怎么跳转

在JavaScript中&#xff0c;可以使用window.location对象来实现页面跳转。window.location对象包含了当前页面的URL信息&#xff0c;可以通过修改它的属性来实现页面跳转。 以下是一些常见的页面跳转方式&#xff1a; 使用window.location.href属性来跳转到一个新的URL&#…

【二】kubernetes master单节点拓展为集群

#服务器 #部署 #云原生 #k8s 一、 前言 一、ubuntu20.04上搭建containerd版&#xff08; 1.2.4 以上&#xff09;k8s及kuboard V3 接上文中&#xff0c;我们已经部署好了单节点master的k8s集群&#xff0c;在生产环境中&#xff0c;单节点的master肯定是不行的&#xff0c;那…

论文阅读_变分自编码器_VAE

英文名称: Auto-Encoding Variational Bayes 中文名称: 自编码变分贝叶斯 论文地址: http://arxiv.org/abs/1312.6114 时间: 2013 作者: Diederik P. Kingma, 阿姆斯特丹大学 引用量: 24840 1 读后感 VAE 变分自编码&#xff08;Variational Autoencoder&#xff09;是一种生…

9.1作业

字体对话框、颜色对话框、文件对话框、保存和打开文件 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void W…

rtsp 拉流 gb28181 收流 经AI 算法 再生成 rtsp server (一)

1、 rtsp 工具 1 vlc 必备工具 2 wireshark 必备工具 3 自己制作的工具 player 使用tcp 拉流&#xff0c;不自己写的话&#xff0c;使用ffmpeg 去写一个播放器就行 4 live555 编译好live555&#xff0c; 将live555的参数修改以下&#xff0c;主要是缓存大小 文章使用c 来写一…

Git的基本使用笔记——狂神说

版本控制 版本迭代&#xff0c; 版本控制( Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史&#xff0c;方便查看更改历史记录&#xff0c;备份以便恢复以前的版本的软件工程技术。 实现跨区域多人协同开发 追踪和记载一个或者多个文件的…