MySQL (十四) 两阶段提交

article/2025/9/14 14:37:07

一. 两阶段提交

1.1 利用 binlog 和redolog 做到两阶段提交

在这里插入图片描述
从上图中看出:最后提交事务的三个步骤:

  1. 写入redo log ,处于prepare状态
  2. 写binlog
  3. 修改redo log 状态变为commit

由于redo log 的提交分为prepare 和commit两个阶段,所以我们称之为两阶段提交。

1.2 为什么要两阶段提交

假设我们不适用两阶段提交,那么binlog和redolog的提交就两种形式:

  1. 先写binlog 再写redolog
  2. 先写redolog 再写binlog

当我们要向表中DDL,插入一条记录R的时候。

情况一:
如果我们先写binlog再写redolog,那么假设binlog写完后崩溃了,此时redolog还没写。那么重启恢复的时候就会出现问题:
binlog中已经有R的记录了,当从主机同步数据的时候,或者我们使用binlog恢复数据的时候,就会同步R这条记录。但是redolog中没有关于R的记录,所以恢复崩溃之后,插入R记录的这个事务是无效的,即数据库中没有该行的记录,而这就造成了数据不一致的情况。

情况二:
如果我们是先写redolog再写 binlog,那么假设redolog写完后崩溃了,此时binlog还没写。那么重启恢复的时候也会出现问题:
redolog中已经有R的记录了,所以崩溃恢复之后,插入R记录的这个事务是有效的,通过该记录可以将数据恢复到数据库中;但是binlog中还没有关于R的记录,所以当从机从主机同步数据的时候,或者我们使用binlog恢复数据的时候,就不会同步到R这条记录,这就造成了数据不一致。

两阶段提交如何保证数据一致性:

情况一:一阶段提交之后崩溃了,即 写入 redo log,处于 prepare 状态 的时候崩溃了,此时:由于 binlog 还没写,redo log 处于 prepare 状态还没提交,所以崩溃恢复的时候,这个事务会回滚,此时 binlog 还没写,所以也不会传到备库。

情况二:假设写完 binlog 之后崩溃了,此时:
redolog 中的日志是不完整的,处于 prepare 状态,还没有提交,那么恢复的时候,首先检查 binlog 中的事务是否存在并且完整,如果存在且完整,则直接提交
事务,如果不存在或者不完整,则回滚事务。

情况三:假设 redolog 处于 commit 状态的时候崩溃了,那么重启后的处理方案同情况二。
由此可见,两阶段提交能够确保数据的一致性。


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

相关文章

mysql之两阶段提交

什么是两阶段提交 当有数据修改时,会先将修改redo log cache和binlog cache然后在刷入到磁盘形成redo log file,当redo log file全都刷入到磁盘时(prepare 状态)和提交成功后才能将binlog cache刷入磁盘,当binlog全部刷…

分布式事务:两阶段提交与三阶段提交

两阶段提交与三阶段提交 分布式事务二阶段提交请求阶段提交阶段举例故障分析柜员侧出现故障或拒绝Proposal第一阶段经理侧出现故障第二阶段经理侧出现故障 二阶段提交存在的问题 三阶段提交canCommit阶段preCommit阶段doCommit阶段特点 参考 分布式事务 满足ACID(原…

正确理解二阶段提交(Two-Phase Commit)

文章目录 明确问题草稿方案原子提交协议希望实现的2个特性正确的二段提交协议(Two-Phase Commit)二阶段提交协议如何满足安全性(Safety)二阶段提交协议如何满足存活性( Liveness) 如何应对超时 超时终止协议 如何应对宕机重启 二阶…

两阶段提交协议(two phase commit protocol,2PC)详解

一、协议概述 两阶段提交协议(two phase commit protocol,2PC)可以保证数据的强一致性,许多分布式关系型数据管理系统采用此协议来完成分布式事务。它是协调所有分布式原子事务参与者,并决定提交或取消(回…

简单谈谈MySQL的两阶段提交

一、简单回顾三种日志 在讲解两阶段提交之前,需要对MySQL中的三种日志即binlog、redo log与undo log有一定的了解。 在这三种日志中,很多同学会把binlog与redo log混淆,下面使用一张表格来简单对比下两者的区别。 当然,如果对bi…

现控笔记(五)稳定性与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…