当前位置: 首页 > news >正文

分布式协同 - 分布式事务_2PC 3PC解决方案

文章目录

  • 导图
  • Pre
  • 2PC(Two-Phase Commit)协议
    • 准备阶段
    • 提交阶段
      • 情况 1:只要有一个事务参与者反馈未就绪(no ready),事务协调者就会回滚事务
      • 情况 2:当所有事务参与者均反馈就绪(ready)消息时,事务协调者会提交(commit)事务
  • 3PC(Three-Phase Commit)协议
    • 3PC的三个阶段
    • 3PC 的流程
  • 3PC 和 2PC 的主要区别
    • 1. 阶段数量不同
    • 2. 容错能力
    • 3. 协议的安全性与复杂性
    • 4. 阻塞问题
    • 5. 事务资源锁定
    • 6. 性能开销
  • 总结

在这里插入图片描述

导图

在这里插入图片描述


Pre

分布式协同 - 分布式事务一二事儿DTP 定义了分布式事务的处理模型,可以针对这个模型提出分布式事务的解决方案,2PC 就是其中一种。

2PC 的全称为两阶段提交(Two Phase Commitment Protocol),是 DTP 模型的最佳实践,解决了在分布式服务或数据库场景下,同一事务对多个节点进行操作的数据一致性问题。

2PC 在一定程度上遵守 ACID 理论的刚性事务的要求,保证了强一致性。 2PC 中有两个概念,

  • 一个是事务协调者,对应 DTP 模型中的事务管理器,用来协调事务,所有事务什么时候准备好、什么时候可以提交都由它来协调和管理;
  • 另一个是事务参与者,对应 DTP 模型中的资源管理器,主要负责处理具体事务、管理需要处理的资源。例如事务参与者可以处理订票业务,扣款业务。

2PC(Two-Phase Commit)协议

+-----------------+                +------------------+                +-----------------+
|   Transaction   |                |   Coordinator    |                |   Participant   |
|     Client      |                |       Node       |                |       Node      |
+-----------------+                +------------------+                +-----------------+|                                  |                                   ||----------(1) Request Start ------>                                   ||                                  |                                   ||                                  | --------------(2) Prepare-------->||                                  |                                   ||                                  | <--------- (3) Acknowledge ------||                                  |                                   ||                                  |                                   ||                                  | --------------(4) Commit--------->||                                  |                                   ||                                  | <--------- (5) Acknowledge ------||                                  |                                   ||                                  |                                   ||                                (End)                               (End)

准备阶段

第一阶段(准备阶段):如下图 所示

在这里插入图片描述

事务协调者(事务管理器)给每个事务参与者(资源管理器)发送准备(prepare)消息,目的是询问大家是不是都准备好了,马上就要执行事务了。事务参与者会根据自身业务和资源情况进行检查,然后给出反馈。检查过程根据业务内容的不同而不同,例如订票业务需要检查是否有剩余票、扣款业务需要检查余额是否足够。

只有检查通过,才能返回就绪(ready)信息。否则,事务将终止,并且等待下次询问。由于检查过程需要完成一些操作,因此需要写 redo 日志和 undo 日志,以便事务失败重试,或者失败回滚时使用。


提交阶段

第二阶段(提交阶段):如下图所示
在这里插入图片描述

如果事务协调者接收到事务参与者检查失败或者超时的消息,会给其发送回滚(rollback)消息,否则发送提交(commit)消息。

情况 1:只要有一个事务参与者反馈未就绪(no ready),事务协调者就会回滚事务

  • a) 事务协调者向所有事务参与者发出回滚请求。
  • b) 事务参与者使用第一阶段中 undo 日志里的信息执行回滚操作,并且释放整个事务期间占用的资源。
  • c) 各事务参与者向事务协调者反馈应答(ack)消息,表示完成操作。
  • d) 事务协调者接收到所有事务参与者反馈的应答消息,即完成了事务回滚。

情况 2:当所有事务参与者均反馈就绪(ready)消息时,事务协调者会提交(commit)事务

  • a) 事务协调者向所有事务参与者发出正式提交事务的请求。
  • b) 事务参与者执行提交(commit)操作,并释放整个事务期间占用的资源。
  • c) 各事务参与者向事务协调者反馈应答(ack)消息,表示完成操作。
  • d) 事务协调者接收到所有事务参与者反馈的应答(ack)消息,即完成了事务提交。

3PC(Three-Phase Commit)协议

3PC(三阶段提交)是分布式事务中的一种协议,旨在解决2PC协议中的阻塞问题。3PC协议通过在2PC的基础上增加了一个阶段,增加了事务的容错能力,从而避免了协调者或参与者崩溃时可能发生的阻塞现象。

3PC的三个阶段

  1. CanCommit 阶段(询问阶段)

    • 协调者向所有参与者发送“CanCommit”请求,询问它们是否可以提交事务。
    • 参与者收到请求后,会检查本地的事务状态。如果没有冲突,且可以提交,它们就返回“Ready”响应;如果事务存在问题,则返回“No”响应,表示无法提交。
  2. PreCommit 阶段(预提交阶段)

    • 如果所有参与者都返回了“Ready”,协调者就会向所有参与者发送“PreCommit”命令,表示准备提交事务,并让它们锁定相关资源。
    • 参与者在接收到“PreCommit”命令后,执行事务的预提交操作并返回确认。
  3. DoCommit 阶段(提交阶段)

    • 如果所有参与者都返回了预提交确认(“PreCommit”),协调者会向所有参与者发送“DoCommit”命令,正式提交事务。
    • 参与者接收到“DoCommit”命令后,执行提交操作,事务完成。

3PC 的流程

+-----------------+                +------------------+                +-----------------+
|   Transaction   |                |   Coordinator    |                |   Participant   |
|     Client      |                |       Node       |                |       Node      |
+-----------------+                +------------------+                +-----------------+|                                  |                                   ||----------(1) Request Start ------>                                   ||                                  |                                   ||                                  |  --------(2) CanCommit --------->||                                  |                                   ||                                  | <----------(3) Ready/No --------||                                  |                                   ||                                  |  --------(4) PreCommit --------->||                                  |                                   ||                                  | <----------(5) PreCommitAck -----||                                  |                                   ||                                  |  --------(6) DoCommit ---------->||                                  |                                   ||                                  | <----------(7) DoCommitAck ------||                                  |                                   ||                                (End)                               (End)

3PC 和 2PC 的主要区别

1. 阶段数量不同

  • 2PC 有两个阶段:

    1. Prepare: 协调者询问参与者是否能提交事务。
    2. Commit/Abort: 根据参与者的响应,协调者决定是否提交或回滚事务。
  • 3PC 有三个阶段:

    1. CanCommit: 协调者询问参与者是否准备提交。
    2. PreCommit: 协调者发送预提交命令,参与者准备提交并锁定资源。
    3. DoCommit: 协调者发送最终提交命令,事务正式提交。

2. 容错能力

  • 2PC 在协调者或参与者崩溃时可能会出现阻塞。例如,如果协调者崩溃后,参与者不知道是应该提交还是回滚,系统可能会陷入阻塞状态,无法继续执行。
  • 3PC 增加了一个额外的阶段(PreCommit),并且在每个阶段都有明确的响应协议,可以减少系统在协调者或参与者崩溃时的阻塞风险。3PC通过引入超时机制预提交锁定,有效减少了数据不一致和系统停滞的概率。

3. 协议的安全性与复杂性

  • 2PC 协议相对简单,但存在阻塞问题,且在部分情况下(例如,协调者崩溃),事务无法保证最终一致性。
  • 3PC 协议在设计上更加复杂,通过引入预提交阶段,提高了系统的容错能力,但也增加了协议的开销和实现的复杂性。

4. 阻塞问题

  • 2PC 存在阻塞问题,特别是在协调者或参与者崩溃的情况下,事务无法继续或回滚,可能会导致长时间的停滞。
  • 3PC 通过引入额外的阶段,并要求所有参与者在每个阶段都给予明确的响应,避免了阻塞的可能性。当协调者或参与者崩溃时,系统会通过超时机制自动恢复,减少了长时间的停滞。

5. 事务资源锁定

  • 2PC 中,事务资源在提交后才被释放,可能会因为参与者的延迟或崩溃导致长时间的资源占用。
  • 3PC 引入了预提交阶段,在PreCommit时就锁定了资源并确保它们在提交前是有效的,因此能更有效地管理资源的占用。

6. 性能开销

  • 2PC 因为只有两个阶段,协议简单,性能相对较好,但当系统出现故障时,性能和一致性会受到较大影响。
  • 3PC 虽然增加了一个阶段,但引入了更多的容错机制,可能会有稍微的性能开销,但能在故障恢复时保持更高的可用性。

总结

特性2PC (Two-Phase Commit)3PC (Three-Phase Commit)
阶段数量2个阶段:Prepare(准备阶段)和Commit/Abort(提交/回滚阶段)3个阶段:CanCommit(询问阶段)、PreCommit(预提交阶段)、DoCommit(提交阶段)
协议设计基于两阶段协议,协议简单但容易导致阻塞问题基于三阶段协议,增加了预提交阶段,减少了阻塞问题
阻塞问题存在阻塞问题,特别是当协调者或参与者崩溃时,系统可能无法继续通过引入PreCommit阶段,减少了崩溃时的阻塞问题,避免了长时间停滞
协调者崩溃的处理协调者崩溃后,参与者不确定事务是提交还是回滚,导致阻塞由于引入了CanCommit和PreCommit阶段,协调者崩溃后的恢复能力较强,减少了阻塞的可能
参与者崩溃的处理如果参与者在Prepare阶段崩溃,事务可能无法提交在PreCommit阶段,参与者能锁定资源,如果崩溃,系统能更好恢复,减少了不一致情况
事务提交的一致性保证一致性,但有可能因为协调者或参与者崩溃导致无法提交或回滚在多数情况下保证一致性,并且通过额外阶段减少了崩溃带来的影响
资源管理资源管理依赖于Prepare阶段,协调者发出提交或回滚命令资源管理通过PreCommit阶段锁定资源,协调者发送最终提交命令
性能开销由于只有两个阶段,性能较高,但可能因为故障导致较长的延迟增加了一个阶段,性能会有一定的开销,但能有效减少阻塞问题
协议复杂性协议较简单,实现起来相对容易,但缺乏容错能力协议更复杂,要求在协议层面上有更多的容错设计和实现
适用场景适用于对一致性要求较高的场景,如分布式数据库事务适用于对高可用性和容错性要求较高的场景,尤其是需要更好恢复能力的分布式系统
超时处理通常需要外部机制(如超时检测)来处理超时问题协议本身提供了对超时和崩溃的处理机制,有更强的容错能力
  • 2PC 由于其简单的设计,适用于一些不涉及复杂容错的场景,但它容易因为崩溃或故障导致阻塞问题,事务可能无法继续进行。
  • 3PC 在 2PC 的基础上增加了一个阶段,提升了系统容错能力,减少了由于协调者或参与者崩溃导致的阻塞,但相应地增加了协议的复杂度和性能开销。

在选择2PC还是3PC时,需要根据具体应用场景的容错要求、性能需求以及系统复杂度进行权衡。

在这里插入图片描述

相关文章:

分布式协同 - 分布式事务_2PC 3PC解决方案

文章目录 导图Pre2PC&#xff08;Two-Phase Commit&#xff09;协议准备阶段提交阶段情况 1&#xff1a;只要有一个事务参与者反馈未就绪&#xff08;no ready&#xff09;&#xff0c;事务协调者就会回滚事务情况 2&#xff1a;当所有事务参与者均反馈就绪&#xff08;ready&a…...

永磁同步电机负载估计算法--自适应扩张状态观测器

一、 原理介绍 在线性扩张观测器中&#xff0c;LESO观测器增益ω0 决定了观测器的跟踪速度&#xff0c;ω0 越大&#xff0c;观测器估计精度越高&#xff0c; 抗干扰能力越强&#xff0c;瞬态响应速度加快&#xff0c;过大则会引入高频噪声使系统不稳定。为使观测器在全速域内…...

【HarmonyOS应用开发——ArkTS语言】购物商城的实现【合集】

目录 &#x1f60b;环境配置&#xff1a;华为HarmonyOS开发者 &#x1f4fa;演示效果&#xff1a; &#x1f4d6;实验步骤及方法&#xff1a; 1. 在src/main/ets文件中创建components文件夹并在其中创建Home.ets和HomeProduct.ets文件。​ 2. 在Home.ets文件中定义 Home 组…...

Python二维码生成器qrcode库

要在Python中生成二维码&#xff0c;你可以使用 qrcode 库。这个库非常方便&#xff0c;允许你生成并保存二维码图像。下面是一个简单的示例&#xff0c;展示了如何使用 qrcode 库生成二维码。 首先&#xff0c;你需要安装 qrcode 库。你可以使用 pip 来安装它&#xff1a; s…...

Python:模拟(包含例题:饮料换购 图像模糊 螺旋矩阵)

模拟题&#xff1a;直接按照题目含义模拟即可&#xff0c;一般不涉及算法 注意&#xff1a; 1.读懂题&#xff1a;理清楚题目流程 2.代码和步骤一一对应&#xff1a;变量名&#xff0c;函数名&#xff0c;函数功能 3.提取重复的部分&#xff0c;写成对应的函数&#xff08;…...

git分支与部署环境的关系以及开发规范

一 某金融机构 1.1 分支分类以及作用 1.master master分支为主分支,用于部署生产环境的分支,无论任何时候都要确保master分支的稳定性;master分支由feature及hotfix分支合并,任何时间都不能直接修改代码。目前用于老仿真和老生产,暂时不动。 2.prod 主分支,是master…...

2024最新鸿蒙开发面试题合集(一)-HarmonyOS NEXT Release(API 12 Release)

1. HarmonyOS应用打包后的文件扩展名是? 打包后的文件扩展名为.hap&#xff08;HarmonyOS Ability Package&#xff09;&#xff0c;这是HarmonyOS应用的标准包格式 2. 页面和自定义组件生命周期有哪些? 页面和自定义组件生命周期说明 有Entry装饰器的component组件的生命…...

【mybatis】详解 # 和 $ 的区别,两者分别适用于哪种场景,使用 $ 不当会造成什么影响

# 和 $ 的区别 在MyBatis中&#xff0c;# 和 $ 是用来处理参数的两种不同方式&#xff0c;它们之间有一些重要的区别&#xff1a; # 符号&#xff1a; # 是用来进行参数占位符的&#xff0c;它会进行 SQL 注入防护。使用 # 时&#xff0c;MyBatis 会将参数值进行预处理&…...

Java面试题,数据结构,图的最短路径算法应用于社交网络分析

图的最短路径算法应用于社交网络分析 在一个大型社交网络中&#xff0c;用户想要找到连接两个特定用户的最短路径。假设你已经有了这个社交网络的数据模型&#xff0c;其中节点代表用户&#xff0c;边代表用户之间的关系。请设计一个解决方案&#xff0c;以找出两个用户之间的…...

Tree数据处理

文章目录 一、Tree数据重置二、Tree拆分成二级数据1、过滤数据2、二级数据 Tree组件的数据处理往往需要使用递归&#xff0c;本文归纳一下常见的数据处理情景&#xff0c;持续更新&#xff1b; 一、Tree数据重置 递归的标志就是寻找子元素的集合字段&#xff0c;一般为children…...

idea配置gitee仓库

idea配置gitee 0、fork开源项目 到自己的仓库&#xff0c;这一步相当于创建了一个自己的git仓库&#xff0c;并复制了别人的开源代码。 注意&#xff1a;如果直接下载别人的开源项目&#xff0c;需要从新配置git仓库信息&#xff0c;因为开源项目一般都设置了git信息。而修改…...

SpringBoot 事务

事务是一组操作的集合, 是一个不可分割的操作.会把所有的操作作为一个整体, 一起向数据库提交或者是撤销操作请求. 所以这组操作要么同时成功, 要么同时失败. 为什么需要事务? 我们在进行程序开发时, 也会有事务的需求. 比如转账操作: 第一步&#xff1a;A 账户 -100 元. …...

我的JAVA-Web基础(1)

1.HTML 2.css CSS&#xff08;层叠样式表&#xff09;提供了多种选择器来定位HTML文档中的元素&#xff0c;以便可以应用样式。以下是三种常用的选择器简述&#xff1a; ID 选择器&#xff1a; ID选择器使用HTML元素的id属性来定位单个元素。每个页面中id应该是唯一的&#xf…...

【Leetcode 热题 100】207. 课程表

问题背景 你这个学期必须选修 n u m C o u r s e s numCourses numCourses 门课程&#xff0c;记为 0 0 0 到 n u m C o u r s e s − 1 numCourses - 1 numCourses−1。 在选修某些课程之前需要一些先修课程。 先修课程按数组 p r e r e q u i s i t e s prerequisites p…...

从CreateDialogIndirectParam起---我与大模型对话

前言&#xff1a; 对当前的大模型来说&#xff0c;一切皆程序&#xff0c;皆标准。只能按照推定的线路行走&#xff0c;就像机器人走进死胡同&#xff0c;不停的踏步也不回头。除非人为去干预它。其实我提出的这个问题前是因为我不清楚了解一部分WinAPI有着严格的检查机制和自毁…...

重温设计模式--建造者模式

文章目录 建造者模式&#xff08;Builder Pattern&#xff09;概述建造者模式UML图作用&#xff1a;建造者模式的结构产品&#xff08;Product&#xff09;&#xff1a;抽象建造者&#xff08;Builder&#xff09;&#xff1a;具体建造者&#xff08;Concrete Builder&#xff…...

CSS(五):定位

目录 相对定位 绝对定位 固定定位 在 CSS 中&#xff0c;position 属性用于控制元素的定位方式&#xff0c;使我们可以精确地控制元素在页面上的位置。定位分为相对定位、绝对定位、和固定定位 相对定位 相对定位&#xff1a;position: relative; 相对定位意味着元素的位置…...

JSON 系列之2:JSON简单查询

本文为Oracle数据库JSON学习系列的第2篇&#xff0c;讲述如何对存储在数据库中的JSON文档进行简单的查询。 创建测试表&#xff0c;插入2条数据&#xff1a; DROP TABLE colortab PURGE;CREATE TABLE colortab (id NUMBER,color VARCHAR2(4000),CONSTRAINT ensure_json CH…...

SQL 简单查询

目录 一、投影查询 1、指定特定列查询 2、修改返回列名查询 3、计算值查询 二、选择查询 1、使用关系表达式 2、使用逻辑表达式 3、使用 BETWEEN关键字 4、使用 IN关键字 5、使用 LIKE关键字 6、使用 IS NULL/ NOT NULL关键字 7、符合条件查询 三、聚合函数查询 一…...

YOLOv9-0.1部分代码阅读笔记-metrics.py

metrics.py utils\metrics.py 目录 metrics.py 1.所需的库和模块 2.def fitness(x): 3.def smooth(y, f0.05): 4.def ap_per_class(tp, conf, pred_cls, target_cls, plotFalse, save_dir., names(), eps1e-16, prefix""): 5.def compute_ap(recall, prec…...

Sonic云真机平台二次开发指南:自定义插件与扩展开发

Sonic云真机平台二次开发指南&#xff1a;自定义插件与扩展开发 【免费下载链接】sonic-server &#x1f389;Back end of Sonic cloud real machine platform. Sonic云真机平台后端服务。 项目地址: https://gitcode.com/gh_mirrors/so/sonic-server Sonic云真机平台是…...

深蓝词库转换器:跨平台输入法词库一键迁移终极指南

深蓝词库转换器&#xff1a;跨平台输入法词库一键迁移终极指南 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 还在为更换输入法而烦恼吗&#xff1f;每次切换到新的…...

QMCDecode:破解音乐加密枷锁,重获数字音频自由

QMCDecode&#xff1a;破解音乐加密枷锁&#xff0c;重获数字音频自由 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默…...

ARM交叉编译避坑指南:搞懂-mfloat-abi参数,告别ABI不兼容的诡异错误

ARM交叉编译避坑指南&#xff1a;搞懂-mfloat-abi参数&#xff0c;告别ABI不兼容的诡异错误 在嵌入式开发领域&#xff0c;ARM架构的交叉编译是每个工程师的必修课。但当你信心满满地配置好工具链&#xff0c;执行make命令时&#xff0c;突然跳出的fatal error: gnu/stubs-soft…...

手把手搭建LoRa智慧农业系统:土壤传感器+网关配置全流程(附Python数据采集代码)

手把手搭建LoRa智慧农业系统&#xff1a;土壤传感器网关配置全流程&#xff08;附Python数据采集代码&#xff09; 在传统农业向数字化转型的浪潮中&#xff0c;低功耗广域网络&#xff08;LPWAN&#xff09;技术正成为连接田间地头的"神经末梢"。想象一下&#xff1…...

Qwen3-TTS-VoiceDesign效果展示:会议纪要自动转语音+重点语句强调合成

Qwen3-TTS-VoiceDesign效果展示&#xff1a;会议纪要自动转语音重点语句强调合成 获取更多AI镜像 想探索更多AI镜像和应用场景&#xff1f;访问 CSDN星图镜像广场&#xff0c;提供丰富的预置镜像&#xff0c;覆盖大模型推理、图像生成、视频生成、模型微调等多个领域&#xff0…...

League Akari:基于Electron与LCU API的LoL客户端工具集架构深度解析

League Akari&#xff1a;基于Electron与LCU API的LoL客户端工具集架构深度解析 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是…...

AI工厂令牌生产加速:统一服务与实时AI架构

使用统一服务和实时AI加速AI工厂中的令牌生产 在当今的AI工厂环境中&#xff0c;性能并非理论概念&#xff0c;而是经济、竞争和生存的关键。可用GPU时间下降1%&#xff0c;可能意味着每小时损失数百万令牌。几分钟的拥塞可能演变成数小时的恢复时间。机架级功率过载会导致功率…...

OurStreets项目动画架构解析:animation-samples中的地图动画最佳实践

OurStreets项目动画架构解析&#xff1a;animation-samples中的地图动画最佳实践 【免费下载链接】animation-samples Multiple samples showing the best practices in animation on Android. 项目地址: https://gitcode.com/gh_mirrors/an/animation-samples 想要在An…...

lite-avatar形象库真实体验:如何快速找到并应用心仪的数字人形象

lite-avatar形象库真实体验&#xff1a;如何快速找到并应用心仪的数字人形象 1. 引言&#xff1a;为什么选择lite-avatar形象库&#xff1f; 在数字人应用开发中&#xff0c;找到高质量且风格合适的虚拟形象往往是最耗时的环节之一。传统方式需要从零开始训练模型&#xff0c…...