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

news2024/11/22 10:59:29

回滚整个事务要怎么清除 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.coloradmin.cn/o/1601220.html

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

相关文章

电商价格监测合规性探讨

品牌在做控价、数据分析的过程中&#xff0c;都需要先有数据作为支撑&#xff0c;也就是说要先采集数据&#xff0c;价格监测也是如此&#xff0c;监测的基础是采集&#xff0c;现在主流的采集形式是爬虫采集&#xff0c;可以理解为人工采集的升级版&#xff0c;以机器代替人工…

Python基于深度学习的车辆特征分析系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

西晋从建立到灭亡51年历史

西晋的建立&#xff0c;也标志着三国时期的结束&#xff0c;也开启了中国历史上的一个新时代。下面让我们来揭开西晋从建立到灭亡51年的历史。 1、高平陵事变 曹丕去世后&#xff0c;魏明帝曹睿继位&#xff0c;但曹睿却英年早逝&#xff0c;幼子曹芳继位。 司马懿受曹睿托孤…

微服务之网关路由

一、概述 1.1认识网关 什么是网关&#xff1f; 顾明思议&#xff0c;网关就是网络的关口。数据在网络间传输&#xff0c;从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。 更通俗的来讲&#xff0c;网关就像是以前园区传达室的大爷。 外…

vue 常用的日历排班,带农历显示组件(2024-04-16)

显示当前月日历组件&#xff0c;里面带农历或节日显示 后面可以丰富一些国家法定节假期的业务需求 代码 js-calendar.js 文件 var lunarInfo [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, //1900-19090x04ae0, 0x0a5b6, 0…

了解 Unity AI:从初学者到高级的综合指南

游戏中的AI是什么? 游戏中的人工智能是指利用人工智能技术使视频游戏中的非玩家角色和实体智能地行动、做出决策、对游戏环境做出反应,并提供引人入胜的动态游戏体验。什么是NPC? NPC 代表“非玩家角色”。NPC 是视频游戏、角色扮演游戏中不受人类玩家控制的角色。它们是计算…

Python-VBA函数之旅-exec函数

目录 一、exec函数的常见应用场景&#xff1a; 二、exec函数安全使用注意事项&#xff1a; 三、exec函数与eval函数对比分析&#xff1a; 1、exec函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、相关文章&#xff1a; 个人主页&#xff1a;神奇夜光…

【word技巧】如何锁定word文档格式不变?

Word文档编辑完成之后不想被其他人修改格式&#xff0c;应该如何设置&#xff1f;限制编辑来搞定。 打开word文档设置限制编辑的界面&#xff0c;我们只勾选【限制对选定样式设置格式】&#xff0c;点击底下的设置&#xff0c;除了勾选第一个选项以外&#xff0c;还可以勾选上…

通过 Ollama、Langchain 实现 RAG

RAG 是什么 RAG 在 Langchain 上的定义是&#xff0c;作为大语言模型最常用的场景就是问答系统&#xff0c;可以针对特别来源数据做问题回答&#xff0c;就是私有数据&#xff0c;这就是 RAG&#xff0c;英文全称是Retrieval Augmented Generation。就是对现有模型数据的增广&…

树和二叉树(一)

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

公园高速公路景区校园IP网络广播音柱SIP音柱

公园高速公路景区校园IP网络广播音柱SIP音柱 适用于学校、车站、教堂、工厂、仓库、公园停车场及露天市场高速公路等场所播放录制语音文件或背景音乐节目&#xff0c;专业一体化音箱设计&#xff0c;高强度防水设计&#xff0c;符合IP54防护等认证&#xff0c;数字化产品&…

一个开源的全自动视频生成软件MoneyPrinterTurbo

只需提供一个视频 主题 或 关键词 &#xff0c;就可以全自动生成视频文案、视频素材、视频字幕、视频背景音乐&#xff0c;然后合成一个高清的短视频。 一&#xff1a;功能特性 完整的 MVC架构&#xff0c;代码 结构清晰&#xff0c;易于维护&#xff0c;支持 API 和 Web界面…

用Scrapy抓取当当网站数据

setting.py实验目的及要求&#xff1a; 【实验目的】 通过本实验了解Scrapy爬虫框架&#xff1b;熟练掌握Scrapy的基本使用方法和常用技巧。 【实验要求】 使用Scrapy框架&#xff0c;抓取网站商品信息&#xff08;京东、淘宝、当当等任选一个&#xff09;&#xff0c;并将结…

软考 系统架构设计师系列知识点之大数据设计理论与实践(8)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之大数据设计理论与实践&#xff08;7&#xff09; 所属章节&#xff1a; 第19章. 大数据架构设计理论与实践 第3节 Lambda架构 19.3.3 Lambda架构介绍 1. 批处理层 2. 加速层 对加速层批处理视图建立索引&#xff0c…

如何将Oracle 中的部分不兼容对象迁移到 OceanBase

本文总结分析了 Oracle 迁移至 OceanBase 时&#xff0c;在出现三种不兼容对象的情况时的处理策略以及迁移前的预检方式&#xff0c;通过提前发现并处理这些问题&#xff0c;可以有效规避迁移过程中的报错风险。 作者&#xff1a;余振兴&#xff0c;爱可生 DBA 团队成员&#x…

【网络编程】如何创建一个自己的并发服务器?

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的网络编程系列之如何创建一个自己的并发服务器&#xff0c;在这篇文章中&#xff0c;你将会学习到在Linux内核中如何创建一个自己的并发服务器&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图来帮助大家…

基于Docker构建CI/CD工具链(十)总结

我们用九篇文章简单的介绍了使用Docker构建CICD工具链&#xff0c;希望对你的工作有所帮助。 基于Docker构建CI/CD工具链&#xff08;一&#xff09;构建基础工具镜像 基于Docker构建CI/CD工具链&#xff08;二&#xff09;快速搭建Gitlab代码库 基于Docker构建CI/CD工具链&…

【DM8】ODBC

官网下载ODBC https://www.unixodbc.org/ 上传到linux系统中 /mnt下 [rootstudy ~]#cd /mnt [rootstudy mnt]# tar -zxvf unixODBC-2.3.12.tar.gz [rootstudy mnt]# cd unixODBC-2.3.12/ [rootstudy unixODBC-2.3.12]# ./configure 注意&#xff1a;若是报以上错 则是gcc未安…

[计算机效率] 网站推荐:格式转换类

4.2 格式转换类 在日常办公和学习中&#xff0c;我们经常需要将不同格式的文件进行转换&#xff0c;特别是PDF文件&#xff0c;因其跨平台、易阅读的特性而备受青睐。然而&#xff0c;PDF文件的编辑和转换往往是一个棘手的问题。今天&#xff0c;我为大家推荐一系列优质的文件…

笔试题2 -- 字符串数组中指定字符串间的最短距离

字符串数组中指定字符串间的最短距离 文章目录 字符串数组中指定字符串间的最短距离题目还原解法一&#xff1a;暴力遍历 (HashVector法)解法二&#xff1a;算法改进 (双指针法)总结 题目链接&#xff1a; 数组中两个字符串的最小距离 – 牛客网 题目还原 给定一个字符串数组s…