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

article/2025/9/15 8:17:48

两阶段提交与三阶段提交

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

分布式事务

满足ACID(原子性、一致性、隔离性、持久性)的一组操作,可以被称为一个事务。随着计算机系统的发展,越来越多的采用分布式的架构来对外提供服务,但是,不同的机器的处理性能、存储性能、网络状态等各有不同,让分布式集群始终对外提供可用的一致性服务一直是需要处理的问题。
为了保证数据变更请求在整个分布式环境下正确地执行,不会导致部分服务器暂时崩溃导致整个集群提供的服务和数据不再相同,在整个分布式系统处理数据变更请求的过程中,需要引入分布式事务的概念。常见的提交方式有二阶段提交(Two-phase Commit,2PC)三阶段提交(Three-phase commit,3PC)

二阶段提交

二阶段提交的底层实现主要分成两个阶段:

  • 请求阶段
  • 提交阶段

请求阶段

协调者通知每个参与者准备提交;
参与者在本地执行事务:

  • 执行成功后,并不提交,告知协调者自己本地已经执行成功;
  • 执行失败后,告知协调者本地作业执行故障

提交阶段

协调者根据第一阶段收集到的参与者的返回信息,决定是否提交:

  • 如果全部的参与者都反馈成功,那么协调者通知所有参与者提交事务
  • 如果存在参与者反馈失败,则协调者通知所有参与者取消事务

收到全部参与者的成功commit信息后,完成本次提交

举例

还是使用经理和柜员的例子。银行有一个经理和三个柜员,客户举老爷子申请存钱1000元,需要最终三个柜员将举老爷子余额+1000记录下来。

在这里插入图片描述
需要注意这里经理向柜员发送proposal和提交是广播出去的。

故障分析

柜员侧出现故障或拒绝Proposal

假如一个柜员暂时离开了,或者柜员这边发现今天不能存入钱了,如下图所示:
在这里插入图片描述

第一阶段经理侧出现故障

假如经理突然寄了,那么时间可能正好在第一阶段或第二阶段。
第一阶段如果经理寄了,经理无法收到柜员的存钱处理完成的消息
在这里插入图片描述
则这个存钱事务一直没有被提交,举老爷子的钱也没有增加1000元。

第二阶段经理侧出现故障

如果在发送COMMIT的消息的过程中,发送了一部分之后,经理寄了
在这里插入图片描述
此时数据会产生不一致。若经理重启,首先看自己的日志到哪了,然后依次去询问柜员最新的commit信息。

二阶段提交存在的问题

  1. 参与者阻塞
    若某个参与者一直没有完成,则需要等待他完成。例如某个柜员业务不熟悉操作很慢,那么客户和经理需要一直等待他完成操作,才能一起进入下一步
  2. 单点故障
    若协调者寄了,那么参与者长期阻塞
  3. 存在数据不一致情况
    若协调者在第二阶段挂了,那么会产生数据不一致的情况。

三阶段提交

三阶段提交在二阶段算法的基础上进行了优化和改进。如下图所示,在整个三阶段提交的过程中,相比二阶段提交,增加了预提交阶段。

canCommit阶段

协调者首先询问所有的参与者的状态,当前是否可以执行业务;如果可以\不可以执行,就直接返回可以/不可以。

preCommit阶段

协调者根据参与者canCommit阶段的响应来决定是否可以继续事务的preCommit操作。preCommit阶段和二阶段提交里面的请求阶段一致

协调者通知每个参与者准备提交;
参与者在本地执行事务:

  • 执行成功后,并不提交,告知协调者自己本地已经执行成功;
  • 执行失败后,告知协调者本地作业执行故障

doCommit阶段

协调者根据参与者preCommit阶段的响应来决定是否可以继续事务的doCommit操作。
发送doCommit后,若接收到了所有参与者的haveCommitted响应,则执行成功;若仅接收到了部分haveCommitted响应,则事务执行中断。

特点

相比2PC,引入超时机制,减少了阻塞问题。此外,增加了一个询问阶段,询问阶段可以确保尽可能早的发现无法执行操作而需要中止的行为。
但是,仍然存在数据不一致问题,在第三阶段如果只有一个参与者收到了abort操作指令,协调者和其他的参与者都会超时,协调者和参与者都继续提交事务,默认为成功,导致数据不一致。

参考

两阶段提交和三阶段提交
二段提交协议与三段提交协议
28 彻底掌握二阶段提交三阶段提交算法原理
两阶段提交(Two-Phase Commit)


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

相关文章

正确理解二阶段提交(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…

使用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)医嘱管理功能简介 ①住院患者开立医嘱、支持医嘱复制、停止、作废等操作; ②医嘱类型含药品、项目、材料、嘱托; ③支持住院各…