MySQL 核心模块揭秘 | 08 期 | 二阶段提交 (2) commit 阶段

MySQL 8 的两阶段提交 MySQL 8的两阶段提交机制通过协调binlog和redo log的写入顺序,解决了数据库崩溃时可能出现的资金丢失等数据一致性问题。其核心是先将事务准备状态写入redo log并刷盘,再写入binlog并刷盘,最后提交事务。这种机制虽然保证了数据安全,但频繁的磁盘刷盘操作(fsync)成为性能瓶颈。MySQL 8.0引入的组提交技术将多个事务的刷盘操作合并为一次,显著提升了性能。测试数据显示,16线程并发下性能提升明显,使数据库在高并发场景下仍能保持较好的事务处理能力。 阅读详情

这篇文章是二阶段提交的 commit 子阶段的前奏,聊聊 commit 子阶段相关的一些概念。

在这里插入图片描述

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

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

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

1. 刷盘这件事

操作系统为文件提供了缓冲区,称为 page cache。

程序写入内容到磁盘文件,实际上是先写入 page cache,再由操作系统把 page cache 中的内容写入磁盘文件。

把 page cache 中的内容写入磁盘文件这个操作,我们通常口语化的称为刷盘。

刷盘有两种方式:

  • 一种是操作系统的后台线程异步刷盘。
  • 另一种是程序主动触发操作系统的同步刷盘。

2. commit 阶段

二阶段提交的 commit 阶段,分为三个子阶段。

flush 子阶段,要干两件事:

第 1 件,触发操作系统把 prepare 阶段及之前产生的 redo 日志刷盘。

事务执行过程中,改变(插入、更新、删除)表中数据产生的 redo 日志、prepare 阶段修改 undo 段状态产生的 redo 日志,都会由后台线程先写入 page cache,再由操作系统把 page cache 中的 redo 日志刷盘。

等待操作系统把 page cache 中的 redo 日志刷盘,这个时间存在不确定性,InnoDB 会在需要时主动触发操作系统马上把 page cache 中的 redo 日志刷盘。

上一篇文章,我们介绍过,二阶段提交的 prepare 阶段不会主动触发操作系统把 page cache 中的 redo 日志刷盘。这个刷盘操作会留到 flush 子阶段进行。

第 2 件,把事务执行过程中产生的 binlog 日志写入 binlog 日志文件。

这个写入操作,也是先写入 page cache,至于操作系统什么时候把 page cache 中的 binlog 日志刷盘,flush 子阶段就不管了。

sync 子阶段,根据系统变量 sync_binlog 的值决定是否要触发操作系统马上把 page cache 中的 binlog 日志刷盘。

commit 子阶段,完成 InnoDB 的事务提交。

3. 组提交

flush 子阶段会触发 redo 日志刷盘,sync 子阶段可能会触发 binlog 日志刷盘,都涉及到磁盘 IO。

TP 场景,比较常见的情况是事务只改变(插入、更新、删除)表中少量数据,产生的 redo 日志、binlog 日志也比较少。

我们把这种事务称为小事务。

以 redo 日志为例,一个事务产生的 redo 日志少,操作系统的一个页就有可能存放多个事务产生的 redo 日志。

如果每个事务提交时都把自己产生的 redo 日志刷盘,共享操作系统同一个页存放 redo 日志的多个事务,就会触发操作系统把这个页多次刷盘。

数据库闲的时候,把操作系统的同一个页多次刷盘,也没啥问题,反正磁盘闲着也是闲着。

数据库忙的时候,假设某个时间点有 1 万个小事务要提交,每 10 个小事务共享操作系统的一个页用于存放 redo 日志,总共需要操作系统的 1000 个页。

1 万个事务各自提交,就要触发操作系统把这 1000 个数据页刷盘 10000 次。

根据上面假设的这个场景,我们可以看到,这些事务都在某个时间点提交,可以等到共享操作系统同一个页的事务把 redo 日志都写入到 page cache 之后,再触发操作系统把 page cache 的这一个页刷盘。

这样一来,1000 个数据页,只刷盘 1000 次就可以了,刷盘次数只有原来的十分之一,效率大大的提高了。

上面是以 redo 日志为例描述操作系统的同一个页重复刷盘的问题,binlog 日志也有同样的问题。

某个时间点提交的多个事务触发操作系统的同一个页重复刷盘,这是个问题,为了解决这个问题,InnoDB 引入了组提交。

4. 队列和互斥量

组提交,就是把一组事务攒到一起提交,InnoDB 使用队列把多个事务攒到一起。

commit 阶段的 3 个子阶段都有自己的队列,分别为 flush 队列、sync 队列、commit 队列。

每个队列都会选出一个队长,负责管理这个队列,选队长的规则很简单,先到先得。

对于每个队列,第一个加入该队列的用户线程就是队长,第二个及以后加入该队列的都是队员。

代码里把队长称为 leader,队员称为 follower。

我们生活中,不管当什么级别的队长,总会有点什么不一样,比如:有点钱、有点权、有点面子。

当选队长的用户线程,会有什么不一样吗?

这个当然是有的,队长有个特权,就是多干活。

每个子阶段的队长,都会把自己和所有队员在对应子阶段要干的事全都干了。队员只需要在旁边当吃瓜群众就好。

commit 子阶段有点不一样,到时候会介绍。

以 flush 子阶段为例,我们假设 flush 队列的队长为 A 队长,A 队长收编一些队员之后,它会带领这帮队员从 flush 队列挪走,并且开始给自己和所有队员干活,队员们就在一旁当吃瓜群众。

A 队长带领它的队员挪走之后,flush 队列就变成空队列了。

接下来第一个进入 flush 队列的用户线程,又成为下一组的队长,我们称它为 B 队长。

A 队长正在干活,还没干完呢。B 队长收编了一些队员之后,也带领这帮队员从 flush 子阶段的队列挪走,并且也要开始给自己和所有队员干活了。

如果 A 队长和 B 队长都把自己和各自队员产生的 binlog 日志写入 binlog 日志文件,相互交叉写入,那是会出乱子的。

为了避免 flush 子阶段出现两个队长同时干活导致出乱子,InnoDB 给 flush 子阶段引入了一个互斥量,名字是 LOCK_log。

sync 子阶段、commit 子阶段也需要避免出现多个队长同时干活的情况,这两个子阶段也有各自的互斥量,分别是 LOCK_sync、LOCK_commit。

5. 总结

二阶段提交的 commit 阶段分为三个子阶段:flush 子阶段、sync 子阶段、commit 子阶段。

flush 子阶段会把 prepare 阶段及之前产生的 redo 日志都刷盘,把事务执行过程中产生的 binlog 日志写入 binlog 日志文件。

sync 子阶段会根据系统变量 sync_binlog 的值决定是否把 binlog 日志刷盘。

为了避免每个事务各自提交,触发操作系统对同一个页频繁的重复刷盘,InnoDB 引入了组提交。

为了避免每个子阶段出现多个队长同时干活的情况,InnoDB 还引入了三个互斥量:LOCK_log、LOCK_sync、LOCK_commit。

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

下期预告:MySQL 核心模块揭秘 | 09 期 | 二阶段提交 (3) flush、sync、commit 子阶段。

更多技术文章,请访问: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
零基础学simulink仿真建模--基于Simulink进行近端策略优化(PPO)路径规划的仿真建模 特点高效性与稳定性:通过引入剪裁机制,在更新策略时限制步长,从而提高了训练过程的稳定性和效率。适用于多种动作空间:可以处理连续和离散的动作空间问题。无需模型:不需要预先知道环境的确切模型,适合复杂或未知环境。挑战收敛速度与稳定性:确保算法能够在合理的时间内找到近似最优解,并保持训练过程的稳定性。探索与利用平衡:在探索新路径和利用已知信息之间取得平衡。计算资源:对于大规模状态空间和动作空间,计算资源需求较高。首先明确要模拟的任务内容。目标(例如到达指定地点、避开障碍物等)。 阅读详情

相关推荐

西门子S7-1200控制伺服/步进电机方法与接线(全)

西门子S7-1200控制伺服/步进电机方法与接线(全) 伺服/步进电机在非标自动化控制中十分常用,但作者发现在各类开源网站上很少有人做西门子1200PLC控制伺服/步进电机的教程,于是今天想着跟大家分享一下。 本文共分为一下几个四个内容。 文章目录西门子S7-1200控制伺服/步进电机方法与接线(全)前言一、准备二、接线1.PLC接线:2.伺服接线:3. 步进电机的接线:三、代码组态代码四、可能出现的问题 前言 工程控制常用到三项异步电机、直流电机等,但他们都无法准确的控制电机角度;于是有了步进电机、

weixin_46060068的博客 7万+

mysql的两阶段提交理解

两阶段提交

sffSswww的博客 832

为什么RingMo能成为遥感领域的首个生成式自监督基础模型?

RingMo作为遥感领域首个生成式自监督基础模型,通过创新的图像掩码建模技术解决了传统方法在遥感图像处理中的挑战。该模型利用两百万张多元数据集进行预训练,在小目标检测、场景分类等任务上表现卓越,显著提升了性能指标。RingMo的技术突破为遥感图像解译提供了高效解决方案,降低了标注成本并增强了模型泛化能力。

ll5678的博客 691

【MySQL内核系列】MySQL8.0 InnoDB事务两阶段提交源码解读

mysql8.0 innodb redolog和binlog两阶段提交源码分析

joychenwenyu的博客 777

别再只盯着YOLOv8了!手把手带你用PaddleDetection的PP-YOLOE+搞定你的第一个检测项目

本文介绍了PP-YOLOE+在目标检测领域的优势与应用实践,对比YOLOv8展示其在精度、速度和部署便利性上的突破。通过详细的代码示例和实战教程,帮助开发者快速上手PaddleDetection工具链,实现产业级目标检测项目,提升开发效率。

weixin_42701915的博客 184

深度排查:网讯网卡WX1860AL4千兆网口降速百兆的硬件陷阱

本文详细剖析了网讯网卡WX1860AL4千兆网口降速至百兆的硬件故障排查过程。通过分析千兆以太网硬件原理,提供从网线、供电到PCB走线、焊接残留的标准化检修流程,并分享两种典型硬件陷阱(线序错误与焊锡短路)的实战修复案例,为硬件工程师解决类似传输速率问题提供系统性的诊断思路与方法。

a3b4c5的博客 1110

MySQL8 - 事务

💡MySQL8中的事务,操作,及隔离级别讲述

rbx508780的博客 1311

STM32F103C8T6+A4988驱动42步进电机全流程(附接线图+代码解析)

本文详细介绍了使用STM32F103C8T6单片机与A4988驱动模块控制42步进电机的完整流程。内容涵盖硬件接线图解析、电流设置、GPIO驱动代码编写以及细分控制等核心实践,旨在帮助嵌入式开发者和DIY爱好者快速实现精准运动控制,适用于3D打印机、CNC等需要精密定位的项目。

Python的专栏 792

MySQL(08)——MySQL事务管理

事务: 一组sql语句(insert、update、delete),全部成功整体才算成功,一个失败整体也算失败。 mysql 的事务默认自动打开,自动提交。 一条sql就是一个事务,所以不需要 事务开启、事务回滚、事务提交。 开启事务: start transaction; 执行sql语句群 出现异常 事务回滚(撤销)事务结束 rollback; 无异常 事务提交(生效) 事务结束commit; ...

Fenggms的博客 445

整车 EOL下线 测试系统介绍

整车下线(EOL)测试专门针对整车进行设计开发,是车企将组装好的整车交付客户前的 最后一道检测工序。EOL 测试针对的是整车下线测试,不同于零部件下线,是整车级别的下线 测试,测试过程关系整车的每个零部件,其测试质量直接影响到整车的质量好坏。因此,整车EOL测试是整车下线必不可少的测试过程.

王小奎的博客 5480

最详细的 SAP ABAP Web Service 创建和消费步骤讲解

本文原版发表于 SAP 官方社区,当时用的英文版写作,标题为:Step by step to create, consume and trace web service in ABAP system https://blogs.sap.com/2014/05/20/step-by-step-to-create-consume-and-trace-web-service-in-abap-system/ 总共阅读量超过 18 万。 How to create web service provider in A

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3149

Mysql Commit事物提交

https://www.cnblogs.com/exceptioneye/p/5451960.html 1、清理undo段信息,对于innodb存储引擎的更新操作来说,undo段需要purge,这里的purge主要职能是,真正删除物理记录。在执行delete或update操作时,实际旧记录没有真正删除,只是在记录上打了一个标记,而是在事务提交后,purge线程真正删除,释放物理页空间。因此,提交过程中会将undo信息加入purge列表,供purge线程处理。 2、释放锁资源,mysql通过锁互斥机制保证不同

qq_39515350的博客 568

YOLOv11 Neck革新:当SDI遇上BiFPN,带你打造精度飙升的特征融合网络

对于科研:这是一个新颖的特征融合思路,能做出差异化的实验,发论文、做项目都很有价值;对于工程:它能解决小目标漏检、大目标定位不准的痛点,让你的检测系统在工业质检、智能安防等场景下更可靠;对于技术成长:掌握了SDI和BiFPN的设计逻辑,你再去看其他特征融合方法(比如FPN、PAN),会有“一通百通”的感觉,以后优化任何检测模型都能举一反三。如果你之前在目标检测的精度上遇到了瓶颈,不妨试试SDI+BiFPN——它就像给YOLOv11装上了“透视眼”,让模型能看清每一个细节。

FJN110的博客 301

MySQL 核心模块揭秘 | 09 期 | 二阶段提交 (3) flush、sync、commit 子阶段

经过上一篇文章的介绍,我们已经对 commit 阶段有了整体的认识。这篇文章,我们一起进入各子阶段,看看它们都会干点什么,以及会怎么干。为了方便理解,我们假设有 30 个事务,它们对应的用户线程编号也从 1 到 30。flush 子阶段,flush 队长会把自己和队员在 prepare 阶段及之前产生的 redo 日志都刷盘,把事务执行过程中产生的 binlog 日志写入 binlog 日志文件。sync 子阶段,如果大于等于系统变量的值,sync 队长会把 binlog 日志刷盘。

ActionTech的博客 1037

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MySQL 核心模块揭秘 | 07 期 | 二阶段提交 (1) prepare 阶段

开启 binlog 的情况下,用户事务需要使用二阶段提交来保证 binlog 和 InnoDB 表的数据一致性。binlog prepare 什么也不会干。InnoDB prepare 会把分配给事务的所有 undo 段的状态修改为 TRX_UNDO_PREPARED,把事务 Xid 写入 undo 日志组的头信息,把内存中事务对象的状态修改为 TRX_STATE_PREPARED。本期问题:二阶段提交的 prepare 阶段为什么不把 redo 日志刷盘?欢迎大家留言交流。下期预告。

ActionTech的博客 1330

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

MySQL 的两阶段提交(Two-Phase Commit, 2PC)

阶段主要操作目的关键日志控制参数PrepareRedo Log 写盘 +fsync+ 标记 PREPARE确保事务修改的物理页变更持久化,为提交或回滚做准备Redo LogBinlog 写盘 +fsync(根据设置)确保事务的逻辑操作记录持久化,用于复制和恢复BinlogCommitRedo Log 标记 COMMIT (通常异步刷盘)在引擎层正式提交事务,释放资源,数据可见Redo Log (状态更新)只要 Binlog 成功写入并刷盘,该事务在引擎层一定可以成功提交。

csdn_tom_168的博客 1371

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

通用:MySQL之BinLog与RedoLog二阶段提交机制

性能问题:两个日志的写入机制不同(RedoLog 是循环写,BinLog 是追加写),强制同时写入会导致 IO 阻塞,降低并发性能;实现复杂度:InnoDB 是第三方存储引擎(后被 MySQL 收购),与服务器层(负责 BinLog)属于不同模块,"一阶段"需要强耦合两者的写入逻辑,难以维护。二阶段提交通过"松耦合"的方式协调两个模块,既保证了一致性,又保留了各自的独立性。:通过二阶段提交保证事务一致性,RedoLog 保障本地持久性,BinLog 保障主从同步与恢复。

weixin_45149504的博客 961

MySQL 核心模块揭秘 | 11 期 | InnoDB 提交事务,提交了什么?

InnoDB 提交事务,就像我们填完一个表格之后,最后盖上的那个戳,总体上来说,要干 3 件事。第 1 件,修改分配给事务的各 undo 段的状态。如果数据库发生崩溃,重新启动后,undo 段的状态是影响事务提交还是回滚的因素之一。第 2 件,修改事务对象的状态。如果数据据库一直运行,不发生崩溃,就靠事务对象的状态来标识事务是否已提交。第 3 件,把各 undo 段中的 undo 日志组加入链表。其它事务都不再需要使用这些 undo 日志时,后台 purge 线程会清理这些 undo 日志组中的日志。

ActionTech的博客 585

MySQL中的两阶段提交(2PC)

在InnoDB存储引擎中,当启用二进制日志(Binlog)且执行事务提交时,会触发两阶段提交(2PC)过程,以确保数据的一致性和持久化安全。

小红的布丁的博客 1099

MySQL 内部使用的两阶段提交机制(2PC)

场景建议机制单库内事务一致性(binlog + redo)✅ 使用 MySQL 内部 2PC多个 MySQL 实例、跨数据库事务✅ 使用 XA 事务协议 或 第三方分布式事务框架(如 Seata)需要图解流程图、崩溃恢复场景、或分布式事务工具对比(如 Seata vs XA)等内容,我也可以继续补充。是否需要?

喝醉酒的小白 1527

详解MySQL二阶段提交(2PC):核心原理与实战要点

MySQL 2PC的核心是协调双日志提交,解决数据一致性问题,是“一致性优先”场景下的核心机制。其本质是牺牲部分性能换取数据可靠,理解其流程和参数,能快速排查主从同步、崩溃恢复等常见问题,助力高可用MySQL架构设计。思考:高并发、允许少量数据丢失的场景,如何通过参数优化2PC性能?欢迎交流。(注:文档部分内容可能由 AI 生成)

赵树祥的博客 614

mysql group commit_MySQL5.7 核心技术揭秘:MySQL Group Commit-阿里云开发者社区

一、大纲一阶段提交二阶段提交三阶段提交组提交总结二、一阶段提交2.1 什么是一阶段提交先了解下含义,其实官方并没有定义啥是一阶段,这里只是我为了上下文和好理解,自己定义的一阶段commit流程。好了,这里的一阶段,其实是针对MySQL没有开启binlog为前提的,因为没有binlog,所以MySQL commit的时候就相对简单很多。解释几个概念:execution state做什么事情呢在内存修...

weixin_36485298的博客 311

浅析TiDB二阶段提交

关键内容说明:1、TiDB 对于每个事务,会涉及改动的所有key中,选择出一个作为当前事务的Primary Key,其他的则为Secondary keys。2、当Primary Key...

老叶茶馆 2077

MySQL 两阶段提交(Two-Phase Commit, 2PC

这个阶段完成后,事务处于“准备就绪”状态,但还未真正提交,仍可回滚。,尤其在崩溃恢复时能够确保事务的原子性和持久性。这个顺序就是 MySQL 实现两阶段提交的核心。不过 MySQL 默认的两阶段提交主要是为了解决。MySQL 的两阶段提交主要用于。,而非分布式场景。

呜呼哈 396

什么是TCC?什么是二阶段提交?三阶段提交?

通过协调者(Coordinator)分两个阶段协调所有参与者(Participants)的事务操作,保证所有节点要么全部提交,要么全部回滚。三阶段提交(3PC)**是解决分布式事务一致性的核心协议。它们的核心目标是协调多个参与节点的事务操作,确保数据最终一致性。,并引入超时机制,降低阻塞风险。、**二阶段提交(2PC)在 2PC 的基础上增加。

大户影视的博客 1481

Redo Log两阶段提交: 断电重启时,MySQL如何保证事务不丢失?

步骤 | 操作 | 位置 | 是否刷盘 || 1 | 修改数据页 | Buffer Pool | 否(内存) || 2 | 写Undo Log | Undo Tablespace | 是 || 3 | 写Redo Log | Redo Log Buffer | 否(内存) || 4 | PREPARE | Redo Log磁盘 |是(fsync)| 5 | 写Binlog | Binlog磁盘 |是(fsync)| 6 | COMMIT标记 | Redo Log磁盘 | 随下次fsync |

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1583
上一篇: MySQL 添加主键可以节省磁盘空间吗?
下一篇: Google 在 MySQL 中推进矢量搜索,在 LLM 支持方面超越 Oracle
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值