3PC(三阶段提交)

news/2024/9/11 23:24:30

三阶段提交

3PC(Three-Phase Commit)是一种分布式系统中用于实现事务一致性的协议,它是在2PC(Two-Phase Commit)的基础上发展而来,旨在解决2PC的一些缺点。与2PC的两个阶段(准备和提交)相比,3PC引入了一个额外的阶段,即预提交阶段。

三个阶段

以下是3PC的三个阶段:

  1. CanCommit(准备阶段):
    • 在这个阶段,协调者向所有的事务参与者询问是否可以提交事务。每个参与者要么发送“同意”消息,表示可以提交,要么发送“中止”消息,表示不能提交。
  2. PreCommit(预提交阶段):
    • 如果所有的参与者都发送了“同意”消息,协调者将向所有的参与者发送“预提交”消息,通知它们准备提交事务。参与者会在本地执行预提交操作,但是还不会真正提交。
  3. DoCommit(提交阶段):
    • 如果在预提交阶段没有发生错误,协调者将向所有的参与者发送“提交”消息,要求它们最终提交事务。如果有任何参与者在预提交阶段发生了错误,协调者将发送“中止”消息,要求所有的参与者回滚事务。

为什么引入3PC?

引入3PC的主要目的是为了解决2PC的阻塞问题。在2PC中,如果在准备阶段有一个参与者不能提交,整个系统就会被阻塞,无法继续事务的提交。3PC通过引入预提交阶段,使得即使在准备阶段有参与者不能提交,系统仍然能够继续前进,提高了系统的可用性和容错性。尽管3PC并不能完全解决所有的分布式系统问题,但相对于2PC来说,它是一种更为灵活和容忍性更强的协议。

和2PC的区别

  1. 阶数不同:2PC有两个阶段,准备阶段和提交阶段;而3PC引入了额外的预提交阶段,协议包括准备阶段、预提交阶段和提交阶段。
  2. 阻塞问题:2PC存在阻塞问题,即在准备阶段有任何参与者不能提交,那么整个系统可能被阻塞;3PC通过引入预提交阶段尝试解决整个问题,在与提交阶段,协调者通知参与者可以准备提交,但尚未真正提交,从而在出现问题时能够更好的处理。
  3. 协议设计:2PC是一种悲观锁协议,一旦准备开始,就要所有节点都能提交;而3PC更加乐观,在CanCommit阶段,只是询问参与者是否可以提交,但并未要求确保一定会提交。
  4. 一致性级别:2PC要求强一致性,要么全部提交,要么全部回滚;3PC也最求强一致性,但更具容忍性。

3PC存在的问题

  1. 阻塞问题的根本为解决:通过预提交阶段减轻了一些阻塞问题,但是在网络分区或者节点故障的情况下,仍然可能导致无法得知参与者状态,无法继续事务的提交。
  2. 性能开销:引入了与提交,可能带来性能上的开销。
  3. 复杂性:引入预提交,增加了协议的复杂性,在实现和维护上相对于其他协议可能更加复杂。

CanCommit阶段返回“同意”后发生故障,系统该如何处理?

超时和重试: 协调者可以设置一个超时时间,在等待参与者的响应时启动。如果超过超时时间仍未收到参与者的确认,可以选择进行重试。这样可以尽量处理一些短暂的故障。

等待参与者恢复: 如果参与者发生故障,系统可以等待参与者自行恢复。一旦参与者恢复,可以重新尝试进行CanCommit阶段。

中止事务: 如果参与者在CanCommit阶段返回“同意”后发生故障,系统可以选择中止整个事务。协调者向所有参与者发送“中止”消息,要求它们回滚事务。这确保了事务的一致性,但可能会引入一些性能开销和数据的不一致性。

补偿性操作: 如果系统允许,可以设计一些补偿性操作,用于处理在CanCommit阶段后参与者发生故障的情况。通过执行适当的补偿性操作,可以尽量还原到一个一致的状态。

日志和持久化: 在CanCommit阶段执行本地操作之前,参与者可以将CanCommit阶段的信息持久化到本地日志中。即使参与者在CanCommit阶段后发生故障,通过日志信息,系统可以在参与者恢复后进行一些补救性操作。

人工介入: 在一些特殊情况下,可能需要人工介入来处理CanCommit阶段后参与者发生故障的问题。这可能包括系统管理员的手动操作,以确保系统的一致性和正常运行。


https://www.xjx100.cn/news/3091942.html

相关文章

【Spring篇】Bean实例化的四种方式及应用案例

目录 Bean的实例化 通过构造方法实例化Bean; 通过简单工厂模式创建对象; 使用案例 通过使用工厂方法模式 使用案例 通过FactoryBean接口实例化 使用案例 Bean的实例化 Bean的实例化有四种方式,这里的实例化Bean和之前学的注入是两回事…

C++中的内存管理

✨前言✨ 📘 博客主页:to Keep博客主页 🙆欢迎关注,👍点赞,📝留言评论 ⏳首发时间:2023年11月21日 📨 博主码云地址:博主码云地址 📕参考书籍&…

为什么云游戏被认为是行业的未来趋势?

5G 时代的到来,游戏行业也正在经历着一场革命性的变革。云游戏,这个看似神秘的新兴领域,正在逐渐成为行业的未来趋势。 一、云游戏的优势 摆脱硬件束缚 在传统游戏中,玩家需要购买昂贵的游戏主机或电脑,才能享受高质…

如何优雅的删除HashMap元素

文章目录 1.数据准备2.删除方式2.1.使用增强 for 循环删除2.2.使用 forEach 循环删除2.3.使用 Iterator 迭代器删除2.4 使用 removeIf 删除&#xff08;推荐使用&#xff09;2.5.使用 Stream 删除&#xff08;推荐使用&#xff09; 1.数据准备 public Map<String, String&g…

面向对象程序设计1-类的定义和使用

第1关&#xff1a;数字时钟走字 任务描述 本关任务&#xff1a;本题中已给出一个时钟类的定义&#xff0c;请模拟数字时钟走字过程。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.类和对象。 编程要求 根据提示&#xff0c;在右侧编辑器补充代码&…

substring-after用法

substring-after&#xff1a;函数返回一个字符串&#xff0c;该字符串是给定子字符串后给定字符串的其余部分。 #句法 substring-after( haystack ,needle) haystack&#xff1a;要评估的字符串。该字符串的一部分将被返回。 needle&#xff1a;要搜索的子字符串。needle在h…

js实现页面滚动时自动切换Sidebar标签,点击标签自动滚动页面

js实现页面滚动时自动切换Sidebar侧边导航标签&#xff0c;点击标签自动滚动页面 <van-sidebar class"sidebar" v-model"activeKey"><van-sidebar-item :title"i.title" click"onChange(i)" v-for"(i,k) in activeList&…

关于校园网使用罗技flow功能

目录 情况概述问题及解决方案 情况概述 我目前设备是一台Macbook air m1处理器&#xff0c;学校给配了一台windows台式&#xff0c;台式机不能连蓝牙&#xff0c;不能连wifi&#xff0c;只能用网线&#xff0c;我的需求是想让mac和windows共用一套键鼠&#xff0c;在了解到罗技…