简单谈谈MySQL的两阶段提交

article/2025/9/15 9:19:14

一、简单回顾三种日志

在讲解两阶段提交之前,需要对MySQL中的三种日志即binlog、redo log与undo log有一定的了解。

在这三种日志中,很多同学会把binlog与redo log混淆,下面使用一张表格来简单对比下两者的区别。

当然,如果对binlog与redo log有更深的兴趣,可以参考我的另外一篇文章数据库日志——binlog、redo log、undo log扫盲

这边只要记住两者的归属于适用场景即可,binlog适用于维护集群内数据的一致性,而redo log用于崩溃恢复。

undo log相对于前面两种日志更好理解些,就是为了回滚事务用的。

MVCC原理其实就是undo log版本链与ReadView的结合,想要弄清楚如何在快照读的情况下实现事务之间的隔离性,可以移步我的这篇文章通俗易懂的MySQL事务及MVCC原理,我先收藏了!


二、一条语句的执行过程

先从整体的角度来观测某件事物,可以避免一上来就陷入局部的泥潭当中。

MySQL分为Server层与存储引擎层,Server层包括连接器、分析器、优化器于执行器等。

而存储引擎层被设计为支持可插拔式,可以支持InnoDB、MyISAM等存储引擎。

一般来说,一条语句,不论是查询还更新,都会走以下的流程。

这部分不是本文的重点,就简单说下各个组件的作用,大家有个印象就行。

连接器

用于和客户端建立连接,管理连接。检查连接中的用户名密码是否正确吗,以及是否对表有操作权限。

分析器

只要是进行词法、语法分析,区分sql关键词与非关键词,生成一颗语法树。如果生成语法树失败,则证明你的sql有语法错误。

之后对语法树进行一些剪枝操作,去除一些无用的条件等。

优化器

生成sql的执行计划,你可以使用explain来查看执行计划。

会基于某些规则来选择走的索引项,在取样的时候可能会存在误差,可是使用force index来强制走某条索引。

执行器

依据执行计划,调用存储引擎的接口,来实现对数据的读写操作。

我们会在下一小节中,简单讲述执行器和存储引擎在两阶段提交中的交互流程。


三、两阶段提交

先看执行器与InnoDB引擎是如何更新一条指定的数据的:

可以看到,InnoDB在写redo log时,并不是一次性写完的,而有两个阶段,Prepare与Commit阶段,这就是"两阶段提交"的含义。

为什么要写redo log,不写redo log的话,根本就不会出现“两阶段提交”的麻烦事啊?

先说结论:在于崩溃恢复。

MySQL为了提升性能,引入了BufferPool缓冲池。查询数据时,先从BufferPool中查询,查询不到则从磁盘加载在BufferPool。

每次对数据的更新,也不总是实时刷新到磁盘,而是先同步到BufferPool中,涉及到的数据页就会变成脏页。

同时会启动后台线程,异步地将脏页刷新到磁盘中,来完成BufferPool与磁盘的数据同步。

如果在某个时间,MySQL突然崩溃,则内存中的BufferPool就会丢失,剩余未同步的数据就会直接消失。

虽然在更新BufferPool后,也写入了binlog中,但binlog并不具备crash-safe的能力。

因为崩溃可能发生在写binlog后,刷脏前。在主从同步的情况下,从节点会拿到多出来的一条binlog。

所以server层的binlog是不支持崩溃恢复的,只是支持误删数据恢复。InnoDB考虑到这一点,自己实现了redo log。

为什么要写两次redo log,写一次不行吗?

先不谈到底写几次redo log合适,如果只写一次redo log会有什么样的问题呢?

redo log与binlog都写一次的话,也就是存在以下两种情况:

先写binlog,再写redo log

当前事务提交后,写入binlog成功,之后主节点崩溃。在主节点重启后,由于没有写入redo log,因此不会恢复该条数据。

而从节点依据binlog在本地回放后,会相对于主节点多出来一条数据,从而产生主从不一致。

先写redo log,再写binlog

当前事务提交后,写入redo log成功,之后主节点崩溃。在主节点重启后,主节点利用redo log进行恢复,就会相对于从节点多出来一条数据,造成主从数据不一致。

因此,只写一次redo log与binlog,无法保证这两种日志在事务提交后的一致性。

也就是无法保证主节点崩溃恢复与从节点本地回放数据的一致性。

在两阶段提交的情况下,是怎么实现崩溃恢复的呢?

首先比较重要的一点是,在写入redo log时,会顺便记录XID,即当前事务id。在写入binlog时,也会写入XID。

如果在写入redo log之前崩溃,那么此时redo log与binlog中都没有,是一致的情况,崩溃也无所谓。

如果在写入redo log prepare阶段后立马崩溃,之后会在崩恢复时,由于redo log没有被标记为commit。于是拿着redo log中的XID去binlog中查找,此时肯定是找不到的,那么执行回滚操作。

如果在写入binlog后立马崩溃,在恢复时,由redo log中的XID可以找到对应的binlog,这个时候直接提交即可。

总的来说,在崩溃恢复后,只要redo log不是处于commit阶段,那么就拿着redo log中的XID去binlog中寻找,找得到就提交,否则就回滚。

在这样的机制下,两阶段提交能在崩溃恢复时,能够对提交中断的事务进行补偿,来确保redo log与binlog的数据一致性。


http://chatgpt.dhexx.cn/article/KeF4LViB.shtml

相关文章

现控笔记(五)稳定性与Lyapunov方法

稳定性与李雅普诺夫方法 线性系统稳定性:只取决于系统的结构和参数,稳定的条件是特征方程的根都具有负实部(在左半根平面),可用劳斯判据、耐奎斯特判据等方法判断、非线性系统的稳定性:与初始条件和外部扰动的大小有关。 稳定性…

Lyapunov稳定性分析复习笔记

前言 本文所提及的稳定性分析是指系统运动状态的稳定性分析,在进行本文标题内容相关的学习之前,我们首先需要回答一个问题,为什么需要进行稳定性分析?其实这个问题是不言而喻的,稳定性问题在当代显得尤为重要&#xf…

Lyapunov-Krasovskii泛函二重积分项求导_原理

Lyapunov-Krasovskii泛函二重积分项求导_原理 回答[引理1][定理1] 2022年下半年,看了很多关于时滞系统和引入时滞的网络化控制系统的论文,对稳定性证明中Lyapunov-Krasovskii泛函中二重积分项求导结果有些疑问,故在知乎上提问寻求帮助&#x…

Lorenz系统最大lyapunov exponent的求解

首先看下Lorenz混沌系统: 赋予初始值,例如: 当然,初始值可以根据需要设定。 看下他的吸引子,很美: 看下他的分叉图:

matlab 基于Lorenz系统 Lyapunov指数的管道超声导波检测

1、内容简介 略 可以交流、咨询、答疑 2、内容说明 为了提高长距离管道超声导波检测中弱导波信号的识别精度,提出了基于 Lorenz 系统 Lyapunov 指数的 管道超声导波检测方法。基于非共振周期信号的参数激励实现 Lorenz 系统的混沌控制,将待测的导波信…

Lyapunov and Stability Theory

一、什么是稳定点 一个控制系统就和一个社会一样,稳定性是首先要解决的重要问题,是其他一切工作的基础。稳定性问题的字面意思很好理解了,那就是系统在受到扰动后,能否能有能力在平衡态继续工作。大家都知道,历史上社…

Lyapunov稳定性分析2(连续时间系统)

Lyapunov稳定性分析2(连续时间系统) 一、李雅普诺夫第一方法(间接法)二、李雅普诺夫第二方法(直接法)三、李雅普诺夫稳定性判定(连续时间系统)3.1 Lyapunov渐近稳定的充要条件&#…

Lyapunov稳定性判定总结及PI滑膜悬架仿真

目录 前言 1.PD、PSD、ND、NSD概念 2. Stable、asymptotic stability、Globalasymptotic stability 3.线性定常系统的稳定性分析 4. 滑模变结构的拉塞尔(Lasalle)不变性原理 5.比例积分滑模2自由度悬架仿真分析 前言 开始学习控制的时候觉得Lyapunov稳定性判定很普通&…

Lypunov函数是什么?

学习视频网址:https://www.bilibili.com/video/BV1vx411V7EH/?spm_id_fromtrigger_reload 一、 概念 二、 李雅普诺夫第一法 (间接法) 三、 李雅普诺夫第二法 (直接法 - 使用最多) 四、例题

Lyapunov

一、正定函数 令是向量x的标量函数,S是x空间包含原点的封闭有限区域,如果对于S中所有的x,都有: (1)存在且连续 (2) (3)当时, 则V(x)是正定的…

Lyapunov稳定性分析3(离散时间系统)

Lyapunov稳定性分析3(离散时间系统) 一、李雅普诺夫稳定性判定1.1 *Lyapunov*两类稳定性方法分析:1.2 总结: 二、举例2.1 MATLAB函数形式:2.2 MATLAB函数实例: 三、离散Lyapunov方程的解 注:Lya…

第三章——Lyapunov理论基础

文章目录 3.1 非线性系统和平衡点非线性系统自治与非自治系统平衡点常规运动 3.2 稳定性的概念稳定性与非稳定性渐进稳定性和指数稳定性局部和全局稳定性 3.3 线性化和局部稳定性3.4 Lyapunov直接法正定函数和Lyapunov函数平衡点理论全局稳定性的Lyapunov理论不变集理论局部不变…

react svg 实现体温单 三测单

技术栈:react svg 效果图: 开发电子病历可以用此控件

从头到脚说单测——谈有效的单元测试(下篇)

导读 在《从头到脚说单测——谈有效的单元测试(上篇)》中主要介绍了:金字塔模型、为何要做单测、单测的阶段及指标,在下篇中我们主要介绍关于mock、和如何不要滥用mock、用例编写的策略等更多精彩内容,让我们赶紧来看…

Eureka Series : Nursing Sheet

三测单 基本生命体征护理单 首页护理记录单var goTop = function() {document.body.scrollTop = document.documentElement.scrollTop = 0; }; var fixedFloat = function(data, bits = 2) {var result = 0.0;result = parseFloat(data).toFixed(bits);return re…

使用vue+zrender绘制体温单 三测单(1)

先上预览地址 http://132.232.99.217:8090/#/ 1.创建项目 使用vue init webpack temperaure 创建一个vue项目 然后安装axios zrender 命令分别是 npm install axios -S npm install zrender安装这2个组件 2.创建公共文件 在以后的使用中会出现本地调试和先上地址这是我们就…

springboot框架开发医院云HIS 住院医生站、住院护士站功能实现

住院医生站主模块:包括医嘱管理、病案首页、分配入科、住院清单、我的质控等子模块 (1)医嘱管理功能简介 ①住院患者开立医嘱、支持医嘱复制、停止、作废等操作; ②医嘱类型含药品、项目、材料、嘱托; ③支持住院各…

我的测试(三)

2014年因部门有管理上变动,我成为部门负责人/我的第一任师傅的副理,协助他进行测试技术团队的管理。前两年的时候主要还是在自动化测试方向,直到2016年的一些变动之后,才开始全面接管这个团队。在那两年里,我们开始正式…

从头到脚说单测——谈有效的单元测试(上篇)

一. 为单元测试“正名” 我曾经认为,单元测试面向的是一个函数。任何走出一个函数的测试,都不是单元测试。 其实,对“单元”的定义取决于自己。如果你正在使用函数式编程,一个单元最有可能指的是一个函数。你的单元测试将使用不…

从头到脚说单测——谈有效的单元测试

在我们谈到单元测试,大都清楚是测试函数符合预期,国外很多大公司都将单测执行的很好,国内成功的案例则相对有限。在本文中,笔者将在腾讯新闻项目中亲身经历单测从无到有的实践过程梳理为可读可参考的经验分享出来。在实践的过程我…