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

这篇文章是二阶段提交的 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_syncLOCK_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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

几种电脑提示mfc140.dll丢失的解决方法,以及如何预防mfc140.dll丢失

mfc140.dll真是一个超级关键的动态链接库文件!一旦这个文件不翼而飞,可能会导致一些程序无法顺利运行,甚至给系统带来麻烦。但别担心!遇到mfc140.dll文件丢失的情况,我们有一堆应对措施可以立马施行,确保问…

掌握Pillow:Python图像处理的艺术

掌握Pillow:Python图像处理的艺术 引言Python与图像处理的概述Pillow库基础导入Pillow库基本概念图像的打开、保存和显示 图像操作基础图像的剪裁图像的旋转和缩放色彩转换和滤镜应用文字和图形的绘制 高级图像处理图像的合成与蒙版操作像素级操作与图像增强复杂图形…

【北京迅为】《iTOP-3588开发板网络环境配置手册》第3章 开发板直连电脑配置方法(不能上外网)

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

python_读取txt文件绘制多条曲线III

先把文件中指定列,去重提取出来,然后根据指定列去匹配数据,最后完成多条数据的绘图; import matplotlib.pyplot as plt import re from datetime import datetime from pylab import mplmpl.rcParams["font.sans-serif"…

Rust入门:GCC或VS2019中的c或c++程序如何调用Rust静态库

首先创建一个rust的库,这里我假设命名为c-to-rust1 cargo new --lib c-to-rust1 其中,src/lib.rs的内容如下, #[no_mangle] pub extern "C" fn get_string() -> *const u8 {b"Hello C World\0".as_ptr() }注解 …

解决微信好友添加频繁问题

今天我们来聊一聊微信好友添加频繁的问题。在日常使用中,有时候我们会遇到一些添加好友受限的情况,那么究竟是什么原因导致了这一问题呢?接下来,让我们逐一来看一看。 1. 添加好友的频率太高 首先,如果我们在短时间内…

中小企业如何降低网络攻击和数据泄露的风险?

德迅云安全收集了Bleeping Computer 网站消息, Arctic Wolf 表示 Akira 勒索软件组织的攻击目标瞄准了中小型企业,自 2023 年 3 月以来,该团伙成功入侵了多家组织,索要的赎金从 20 万美元到 400 多万美元不等,如果受害…

猴子吃桃:玩转二分思维

前言 在计算机编程领域,算法是解决问题的有效途径之一。而算法题则是考察程序员解决问题能力的重要手段之一。在这篇文章中,我们将通过一个经典的算法题目——猴子吃桃,来探讨算法思维的重要性以及解题的方法。 题目描述 孙悟空喜欢吃蟠桃…

企业计算机服务器中了devos勒索病毒怎么解密,devos勒索病毒解密流程

现在,很多企业都依赖网络计算机的力量开展各项工作业务,为企业的生产运营提供了极大便利,但网络也会搜集存储各个用户的信息便于统计分析,从而导致了企业的数据安全也会受到很大影响。近日,云天数据恢复中心接到多家企…

【阅读笔记】最通俗易懂的 transformer 笔记

这里写目录标题 前言第 1 节 N 元文法语言模型1.2、平滑(Smoothing)1.2.1、加 1 平滑 / 拉普拉斯平滑(Add-One Smoothing / Laplace Smoothing)1.2.2、 δ \delta δ 平滑(Add-K Smoothing / Delta Smoothing&#xf…

Xilinx高级调试方法--远程调试

Xilinx高级调试方法--远程调试 1 虚拟电缆调试2 FPGA设计2.1 扩展配置接口 3 PCIe-XVC驱动3.1 PCIe-XVC驱动3.2 XVC-Server 4 Vivado Design Suite4.1 同一台主机4.2 不同主机 本文主要介绍Xilinx的一些高级调试方法,以及如何使用Xilinx的相关IP。 1 虚拟电缆调试 …

CAN通信篇 - CanSM模块配置(五)

文章目录 CanSMConfigurationCanSMManagerNetworkCanSMGeneralCanSMGeneration总结Can State Manager (CanSM)模块,是CAN网络的状态管理模块,所有对CAN网络状态的请求都是通过CanSM实现。这里我们介绍一下在Davinci Configurator中CanSM模块的配置。 在CanSM模块的总线管理…

游泳耳机哪个牌子好?四大热卖游泳耳机汇总,年度首选

在当今日益注重健康生活方式的时代,游泳作为一项全身性的有氧运动备受青睐。然而,对于许多游泳爱好者来说,水下世界的孤独可能会让他们感到无聊。而游泳耳机的出现不仅为游泳者带来了音乐的陪伴,还让他们能够在水下畅享各种声音&a…

【译】WordPress Bricks主题安全漏洞曝光,25,000个安装受影响

WordPress的Bricks主题存在一个严重的安全漏洞,恶意威胁行为者正在积极利用该漏洞在易受攻击的安装上运行任意PHP代码。 该漏洞被跟踪为CVE-2024-25600(CVSS评分:9.8),使未经身份验证的攻击者能够实现远程代码执行。它…

【MySQL】事务?隔离级别?锁?详解MySQL并发控制机制

目录 1.先理清一下概念 2.锁 2.1.分类 2.2.表锁 2.3.行锁(MVCC) 2.4.间隙锁 2.5.行锁变表锁 2.6.强制锁行 1.先理清一下概念 所谓并发控制指的是在对数据库进行并发操作时如何保证数据的一致性和正确性。在数据库中与并发控制相关的概念有如下几…

【企业动态】欢迎法国客户来访东胜物联,深入探讨智能化合作

本周,来自法国的客户莅临我司工厂进行实地参观考察。客户是一家历史悠久的设备供应商,其产品涵盖冷链、餐饮、农业等多个行业应用领域,正致力于从传统设备向智能设备转型,希望将设备接入物联网。在此次访问中,他们参观…

geoserver+mapbox-gl 离线部署矢量切片地图服务学习笔记

geoserver安装 geoserver的安装包可以在官网下载Download - GeoServer,想要选择版本点击Archived找到指定版本进行下载http://geoserver.org/download/ (如果网络不稳定,也可以直接使用下面的下载地址) geoserver-2.15.0.rar资…

从新手到专家:一探究竟,最佳的Excel学习网站推荐!

介绍:Excel是一款由微软公司开发的电子表格软件,是Microsoft Office套件的一部分。它通过网格形式的工作表提供数据存储、分析和可视化等功能,适用于个人计算机数据处理。具体介绍如下: 数据存储:Excel能够存储大量数据…

大语言模型(LLM):每个专业人士的完美助手

「大语言模型(LLM)革命」:ChatGPT如何引领工作效率新篇章 在不断发展的技术领域,像 ChatGPT 这样的大型语言模型 (LLM) 已成为各行业专业人士不可或缺的工具。 这篇博文探讨了大语言模型(LLM)在专业环境中的…

Linux第69步_依据“旧字符设备的一般模板”编写LED驱动

在编写LED驱动之前,先要了解和硬件有关的一些知识。 1、了解“MMU内存管理单元”以及相关函数 MMU是Memory Manage Unit的缩写,意思是“内存管理单元”。 老版本的Linux内核要求处理器必须有“MMU内存管理单元”,而现在的Linux内核已经支持…