MySQL 核心模块揭秘 | 14 期 | 回滚整个事务

回滚整个事务要怎么清除 binlog 日志,InnoDB 又会进行哪些操作?

作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。

在这里插入图片描述

正文

1. 准备工作

创建测试表:

CREATE TABLE `t1` (`id` int unsigned NOT NULL AUTO_INCREMENT,`i1` int DEFAULT '0',PRIMARY KEY (`id`) USING BTREE,KEY `idx_i1` (`i1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

插入测试数据:

INSERT INTO `t1` (`id`, `i1`) VALUES
(10, 101), (20, 201),
(30, 301), (40, 401);

示例 SQL:

/* 1 */ begin;
/* 2 */ insert into t1(id, i1)values(50, 501);
/* 3 */ insert into t1(id, i1)values(60, 601);
/* 4 */ rollback;

每条 SQL 前面的数字是它的编号,4 条 SQL 分别为 SQL 1、SQL 2、SQL 3、SQL 4,其中,SQL 4 是本文的主角。

SQL 2 插入记录 <id = 50, i1 = 501> 产生的 undo 日志编号为 0。

SQL 3 插入记录 <id = 60, i1 = 601> 产生的 undo 日志编号为 1。

2. binlog 回滚

示例 SQL 的两条 insert 语句执行过程中,会产生 binlog 日志,存放到 trx cache 中。

回滚整个事务时,事务执行过程中改变(插入、更新、删除)的数据都不要了,产生的 binlog 日志也就没有用了。

回滚整个事务,首先要进行的步骤就是 binlog 回滚。从这个步骤的名字来看,我们预期 MySQL 会在这一步把 trx cache 中的 binlog 日志都清除。

不过,我们要失望了,因为这一步什么都没干。

下面是 binlog 回滚的代码:

static int binlog_rollback(handlerton *, THD *thd, bool all) {DBUG_TRACE;int error = 0;if (thd->lex->sql_command == SQLCOM_ROLLBACK_TO_SAVEPOINT)error = mysql_bin_log.rollback(thd, all);return error;
}

从代码可以看到,只有 thd->lex->sql_command 为 SQLCOM_ROLLBACK_TO_SAVEPOINT 才会调用 mysql_bin_log.rollback(thd, all) 执行 binlog 回滚操作。

然而,执行 rollback 语句时,thd->lex->sql_command 为 SQLCOM_ROLLBACK,不满足 if 条件,上面的代码就什么都不会干了。

那么,trx cache 中的 binlog 日志什么时候会清除?

别急,后面会有专门的小节介绍。

3. InnoDB 回滚

binlog 回滚操作结束之后,接下来就是 InnoDB 回滚了。

InnoDB 回滚操作,会读取并解析事务产生的所有 undo 日志,并执行产生这些 undo 日志的操作的反向操作,也就是回滚

回滚过程中,会根据 undo 日志产生的时间,从后往前读取并解析日志,再执行这条日志对应的回滚操作。

示例 SQL 中,执行了两条 insert 语句,会产生两条 undo 日志,编号分别为 0、1。以主键索引为例,回滚过程如下:

  • 读取最新的 undo 日志(编号为 1)。
  • 解析 undo 日志得到 <id = 60>
  • 删除 t1 表中 id = 60 的记录。
  • 读取上一条 undo 日志(编号为 0)。
  • 解析 undo 日志得到 <id = 50>
  • 删除 t1 表中 id = 50 的记录。
  • 读取上一条 undo 日志,没有了,InnoDB 回滚操作结束。

4. 提交事务

InnoDB 回滚操作完成之后,接下来要怎么办?

这其实取决于回滚操作是怎么进行的。

我最初理解的回滚操作,是把事务执行过程中改变(插入、更新、删除)的记录恢复原样,就像事务什么都没干过一样。

然而,实际情况没有这么理想。

事务执行过程中改变过的那些记录,回滚之后:

  • 从逻辑上来看,恢复了原样,确实就像事务什么都没干过一样。
  • 从物理上来看,可能已经发生了变化,因为记录的位置有可能和修改之前不一样。

唠叨这么多,就是想说清楚一件事:事务的回滚操作,不是原地撤销对数据页的修改,而是通过再次修改数据页实现的。

既然修改了数据页,那就需要执行提交操作,才能让这些修改生效。

接下来,要执行的操作,就是把 InnoDB 回滚操作过程中对数据页的修改提交了,也就是提交事务。

不过,这里的提交事务和 commit 语句提交事务不一样。

执行 commit 语句时,因为有 binlog 和 InnoDB 两个存储引擎,需要使用二阶段提交。

事务执行过程中改变(插入、更新、删除)记录,会产生 binlog 日志。

回滚时,要把记录再修改回原来的样子。从逻辑上来看,记录就像是从来没有发生过变化,binlog 日志也就不需要了。

所以,InnoDB 回滚完成之后提交事务,不需要把 trx cache 中的 binlog 日志写入 binlog 日志文件并刷盘,只需要提交 InnoDB 事务就可以了。

关于提交 InnoDB 事务的具体逻辑,可以参照第 11 期《InnoDB 提交事务,提交了什么?》。

5. 清除 binlog 日志

trx cache 中的 binlog 日志有可能一部分存放在内存 buffer 中,另一部分存放在磁盘临时文件中。

清除操作需要同时清除 trx cache 内存 buffer 和磁盘临时文件中的 binlog 日志,分为两个步骤进行:

  • 清空内存 buffer,让 trx cache 的 write_pos 指向内存 buffer 的开始处即可。
  • 清空磁盘临时文件,首先会把文件的 seek offset 设置为 0,让文件本身的位置指针指向文件开头处,然后截断磁盘临时文件,释放文件占用的空间。

前面的 binlog 回滚步骤,没有清除事务执行过程中产生的 binlog 日志,而是留到 InnoDB 回滚步骤中提交事务完成之后才执行。这是因为:

  • 清空磁盘临时文件中 binlog 日志的过程不可逆,如果中间出现问题,不能回退。
  • InnoDB 回滚步骤中提交事务的容错性更好,回滚失败之后就不清除 binlog 日志了,也不损失什么。

6. 总结

回滚整个事务,主要分为三大步骤。

第 1 步,执行 binlog 回滚操作,其实什么也没干。

第 2 步,执行 InnoDB 回滚操作,会把事务执行过程中改变(插入、更新、删除)的记录恢复原样(至少从逻辑上来看是这样的)。

最后,还会提交 InnoDB 事务,让回滚操作对数据页的修改生效。

第 3 步,清除事务执行过程中产生的、临时存放于 trx cache 中的 binlog 日志。

本期问题:关于本期内容,如有问题,欢迎留言交流。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

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

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

相关文章

第七届机器学习与机器智能国际会议(MLMI 2024)即将召开!

第七届机器学习与机器智能国际会议&#xff08;MLMI 2024&#xff09;将于2024年8月2-4日在日本大阪举行。AI之巅&#xff0c;智慧之源&#xff0c;MLMI 2024将汇聚全球机器学习与机器智能领域的专家学者&#xff0c;分享最新的研究成果和实践经验&#xff0c;共同探讨如何将最…

安防视频监控/视频集中存储EasyCVR平台级联时,下级平台未发流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

常见面试算法题-九宫格按键输入法

■ 题目描述 九宫格按键输入&#xff0c;判断输出&#xff0c;有英文和数字两个模式&#xff0c;默认是数字模式&#xff0c;数字模式直接输出数字&#xff0c;英文模式连续按同一个按键会依次出现这个按键上的字母&#xff0c;如果输入”/”或者其他字符&#xff0c;则循环中…

基于Echarts的超市销售可视化分析系统(数据+程序+论文

本论文旨在研究Python技术和ECharts可视化技术在超市销售数据分析系统中的应用。本系统通过对超市销售数据进行分析和可视化展示&#xff0c;帮助决策层更好地了解销售情况和趋势&#xff0c;进而做出更有针对性的决策。本系统主要包括数据处理、数据可视化和系统测试三个模块。…

SpringBoot相关知识点总结

1 SpringBoot的目的 简化开发&#xff0c;开箱即用。 2 Spring Boot Starter Spring Boot Starter 是 Spring Boot 中的一个重要概念&#xff0c;它是一种提供依赖项的方式&#xff0c;可以帮助开发人员快速集成各种第三方库和框架。Spring Boot Starter 的目的是简化 Sprin…

椭圆曲线密码学(ECC)基本介绍和总结

背景 ECC英文全称"Elliptic Curve Cryptography"&#xff0c;其背后的密码学原理或者说安全性&#xff0c;是基于椭圆曲线离散对数问题&#xff08;Elliptic Curve Discrete Logarithm Problem&#xff0c;ECDLP&#xff09;。ECC密码学被普遍认为是RSA密码系统的接…

本地做好准备上传到Git分支,发现git上已经更新了,上传到dev分支

git add . git commit -m 备注 git pull --rebase origin dev 拉取dev上的代码合并到本地 git push -u origin dev推到远程dev上&#xff08;注意着可能不是最后一步&#xff0c;先看完&#xff09; 如果报错&#xff0c;意思是本地没有dev分支&#xff0c;没办法上传到git上…

Qt对象池,单例模式,对象池可以存储其他类的对象指针

代码描述&#xff1a; 写了一个类&#xff0c;命名为对象池&#xff08;ObjectPool &#xff09;&#xff0c;里面放个map容器。 3个功能&#xff1a;添加对象&#xff0c;删除对象&#xff0c;查找对象 该类只构建一次&#xff0c;故采用单例模式功能描述&#xff1a;对象池可…

树和二叉树(一)

一、树 非线性数据结构&#xff0c;在实际场景中&#xff0c;存在一对多&#xff0c;多对多的情况。 树( tree&#xff09;是n (n>0&#xff09;个节点的有限集。当n0时&#xff0c;称为空树。 在任意一个非空树中&#xff0c;有如下特点。 1.有且仅有一个特定的称为根的节点…

ELK日志分析系统之Kafka

目录 一、消息队列基本介绍 1、为什么需要消息队列(MQ) 2、使用消息队列的好处 1.解耦 2.可恢复性 3.缓冲 4.灵活性 & 峰值处理能力 5.异步通信 3、Kafka消息队列的两种模式 1.点对点模式 2.发布/订阅模式 二、Kafka基本介绍 1、Kafka定义 2、Kafka概念 3、…

SSRF靶场

SSRF概述 ​ 强制服务器发送一个攻击者的请求 ​ 互联网上的很多web应用提供了从其他服务器&#xff08;也可以是本地)获取数据的功能。使用用户指定的URL&#xff0c;web应用可以获取图片&#xff08;载入图片&#xff09;、文件资源&#xff08;下载或读取)。如下图所示&…

【Blockchain】连接智能合约与现实世界的桥梁Chainlink

去中心化预言机试图实现依赖因果关系而不是个人关系的去信任和确定性结果。它以与区块链网络相同的方式实现这些结果&#xff0c;即在许多网络参与者之间分配信任。通过利用许多不同的数据源并实施不受单个实体控制的预言机系统&#xff0c;去中心化的预言机网络有可能为智能合…

阿里云优惠券使用方法图解_优惠券免费领取入口

2024年最新阿里云优惠代金券领取入口&#xff0c;阿里云服务器优惠代金券、域名代金券&#xff0c;在领券中心可以领取当前最新可用的满减代金券&#xff0c;阿里云百科aliyunbaike.com分享阿里云服务器代金券、领券中心、域名代金券领取、代金券查询及使用方法&#xff0c;可以…

第11章 数据仓库和数据智能知识点梳理

第11章 数据仓库和数据智能知识点梳理&#xff08;附带页码&#xff09; ◼ 数据仓库&#xff08;Data Warehouse&#xff0c;DW&#xff09;&#xff1a;始于 20 世纪 80 年代&#xff0c;发展于 20 世纪 90 年代&#xff0c;后与商务智能&#xff08;Business Inteligence,BI…

jenkins下载安装(mac)

下载官网 直接命令安装 Sample commands: Install the latest LTS version: brew install jenkins-ltsStart the Jenkins service: brew services start jenkins-ltsRestart the Jenkins service: brew services restart jenkins-ltsUpdate the Jenkins version: brew upgrade …

Linux 安装KVM虚拟机

什么是KVM虚拟机&#xff1f; KVM 是 Kernel-based Virtual Machine 的缩写&#xff0c;是一种用于虚拟化的开源硬件虚拟化技术。它使用 Linux 内核的虚拟化模块&#xff0c;将物理服务器划分为多个虚拟机。KVM 允许虚拟机直接访问物理硬件资源,从而提供出色的性能和稳定性,同…

WARNING: No swap limit support——查看docker状态时提示警告

环境&#xff1a;Ubuntu 20.04 1、警告详情 执行命令 service docker status如下图 2、解决办法 2.1 修改文件 执行命令 vim /etc/default/grub在GRUB_CMDLINE_LINUX中追加cgroup_enablememory swapaccount1&#xff0c;如下&#xff1a; # If you change this file…

【六】fastapi+vue前后端分离项目

前端代码 https://gitee.com/feiminjie/helloworldfront 后端代码 https://gitee.com/feiminjie/helloworld 整体效果 首页 用例管理页 用例详情页

GPT 浅析

GPT 浅析 文章目录 GPT 浅析GPT 1无监督预训练有监督微调任务相关的输入变换 GPT2GPT3 GPT 1 在模型架构上&#xff0c;GPT-1基于Transformer构造&#xff0c;这是因为与其他卷积神经网 络或者循环神经网络相比&#xff0c;Transformer提供了效率更高的方法来处理文本 中的长期…

几年前删除的照片如何恢复?5步操作,快速找回iPhone照片

“去年三月份参加了社区的志愿者活动拍了好几张照片&#xff0c;近期学校组织我申报市级优秀学生需要我的参加志愿者的照片当材料&#xff0c;但是照片在一年前就删掉了。删除的时间比较久&#xff0c;各位有没有什么方法可以恢复苹果手机的照片&#xff1f;” 在使用苹果手机的…