二阶段提交(2pc)协议

news2024/10/5 14:45:41

二阶段提交(2pc)协议

1、 简介

二阶段提交算法是一个分布式一致性算法,强一致、中心化的原子提交协议,主要用来解决分布式事务问题。在单体spring应用中我们往往通过一个@Transactional注解就可以保证方法的事务性,但是在分布式场景下,serviceA往往会调用serviceB和ServiceC等有自己单独数据库的服务。如果serviceb成功了,servicec失败了,这种情况的回滚就需要用到分布式事务了。
在这里插入图片描述

2阶段提交包含两个阶段,即准备阶段和提交阶段。包含俩种角色,即协调者(Coordinator)和参与者(Participant)。协调者它就是协调整个事务的提交和回滚这两个操作,而参与者呢就是这个分布式事务中的事务资源拥有者。那么事务资源怎么去理解呢?图中的ServiceA可以类比为协调者,ServiceB和ServiceC类比为参与者。当SeriveB和ServiceC都执行成功后,协调者ServiceA才会提交本次的分布式事务。

2、 2pc第一阶段

准备阶段,是用于协调者通过Prepare消息,通知参与者去锁定一些事务资源。在下图这个案例中,第一步客户端它发起一个分布式事务给协调者,协调者就会广播Prepare请求给所有的参与者。所有的参与者收到这个操作之后呢它就会在本地记录一个事务日志,undo和redo日志。在这个过程中的所有的参与者也会锁定本次分布式事务,需要用到的一些事务资源。它会根据这个需要锁定的事务资源它会尝试去执行,如果它能够执行的话它就给协调者反馈一个yes的响应。如果不能够执行的话,它就反馈一个no响应。因为我们的参与者会给协调者一个yes或者no响应,二阶段提交也是分为两种情况,一种是提交,一种是回滚。当我们的协调者收到所有的参与者的响应都是yes的时候,它就会执行一个提交操作。然后进入到第二阶段。
第一阶段

3、 2pc第二阶段

第二阶段的协调者会向所有的参与者广播这个global commit消息,这个消息就是通知所有的参与者你可以提交本次的分支事务了。所有的参与者收到这个global commit消息之后,它就会根据第一阶段记录这个redo日志它就会提交本地的分支事务。提交成功之后,它就会返回一个ack响应给协调者,协调者收到所有的参与者成功的响应之后,它就会给客户端返回成功,也就是说本次的分布式事务呢就提交成功了。如果协调者在第一阶段的时候收到有一个参与者返回为no的情况的话,那它就会进入到global rollback的阶段也就是说全局回滚的阶段,协调者会向所有的参与者发送一个global rollback消息,每个参与者收到这个global rollback消息之后,它就会根据第一个阶段记录的undo日志,回滚到执行本次全局事务之前的状态,回滚成功之后它会给协调者返回一个ack响应,协调者收到所有ack后告诉客户端本次全局事务执行失败了。

第二阶段

4、 存在的问题

4.1 同步阻塞问题

一个比较明显的问题呢就是同步阻塞。因为协调者,它需要等待所有的参与者都给它一个yes的响应或者是no响应的时候,它才会进入第二阶段,所以协调者这里有个同步阻塞的问题,协调者要等待所有的参与者响应。而第二个阻塞的问题在于在第二阶段的过程中,参与者必须要等待协调者的global commit消息 或者是global rollback消息之后它才会执行第二阶段,因为第一阶段prepare的时候,参与者锁定了本次分支事务的事务资源,锁定了事务资源后其他事务时不能访问的,如果协调者宕机了,没法通知参与者去执行第二阶段,那么参与者就释放不了事务资源。

4.2 2PC模型中可能出现的数据不一致问题

在2PC模型中,第一阶段是准备阶段。在这个阶段,协调者向参与者发送准备请求,要求参与者准备进行事务提交。

如果协调者在第一阶段崩溃,以下情况可能发生:

  1. 参与者等待超时:
    参与者可能一直等待协调者的消息,如果协调者崩溃,参与者可能会无限期地等待下去。
  2. 参与者提交事务:
    在第一阶段中,参与者接收到准备请求后,会将事务准备好以等待提交。如果协调者崩溃后,参与者可能会提交自己的事务,因为它无法得知协调者是否要求回滚事务。

由于以上情况,数据不一致的情况是可能发生的。如果协调者崩溃,部分参与者可能已经提交了事务,而其他参与者可能还在等待或者准备回滚事务。这种情况下,数据在不同参与者之间就会不一致。因此,在第一阶段中,协调者的崩溃可能导致数据不一致的情况发生。

4.3单点故障:

2PC算法中的协调者节点是一个关键节点。如果协调者节点发生故障,整个系统将无法继续进行任务的提交,因为参与者节点需要等待协调者的指令。这种单点故障可能导致系统的可用性降低。

4.4脑裂(Split-Brain)问题:

在某些情况下,如果网络分区或故障导致协调者和参与者之间的通信中断,系统可能会出现脑裂现象。即,一部分参与者可能收到了提交请求并执行了事务,而另一部分参与者则没有收到请求并保持原始状态,从而导致数据不一致。

4.5过于保守

任何一个参与者出现问题,都会影响整个事务的进程。

为了解决这些问题,人们提出了多种改进方案,如三阶段提交协议(3PC)和基于Paxos或Raft等算法的分布式一致性协议。这些改进方案在保持数据一致性的同时,也试图降低阻塞、单点故障和数据不一致的风险,并提高系统的性能和可用性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1819556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线性代数|机器学习-P13计算特征值和奇异值

文章目录 1. 特征值1.1 特征值求解思路1.1 相似矩阵构造 1. 特征值 1.1 特征值求解思路 我们想要计算一个矩阵的特征值,一般是用如下公式: ∣ ∣ A − λ I ∣ ∣ 0 → λ 1 , λ 2 , ⋯ , λ n \begin{equation} ||A-\lambda I||0\rightarrow \lamb…

CPN Tools学习——时间和队列【重要】

-Timed Color Sets 时间颜色集 -Token Stamps 令牌时间戳 -Event Clock 全局/事件/模拟时钟 -Time Delays on Transitions过渡的时间延迟 - List Color Set列表颜色集 - Queue排队 1.时间颜色集 在定时CPN模型令牌中有: (1)象征性的颜…

CTFHUB-SQL注入-Cookie注入

由于本关是cookie注入,就不浪费时间判断注入了,在该页面使用 burp工具 抓包,修改cookie后面,加上SQL语句,关掉burp抓包,就可以在题目页面显示结果了 判断字段数量 发现字段数量是2列 使用id-1 union sele…

智慧工地:构筑未来建筑的智能脉络

在科技日新月异的今天,智慧城市的建设已不再局限于城市生活的方方面面,而是深入到了城市发展的每一个细胞——工地。本文旨在深度剖析智慧工地的核心价值、关键技术及对建筑业转型升级的深远影响。 一、智慧工地:定义与愿景 智慧工地是指运…

~$开头的临时文件是什么?可以删除吗?

(2023.12.4) 在进行Word文档编辑的时候,都会产生一个以~$开头的临时文件,它会自动备份文档编辑内容,若是正常关闭程序,这个文档就会自动消失;而在非正常情况下关闭word文档,如断电&…

智能座舱软件性能与可靠性的评估和改进

随着智能汽车的不断发展,智能座舱在性能与可靠性上暴露出体验不佳、投诉渐多的问题,本文从工程化的角度简述了如何构建智能座舱软件的评估框架,以及如何持续改进其性能和可靠性。 1. 智能座舱软件性能和可靠性表现不佳 据毕马威发布的《2023…

线程池前置知识

并发和并行 并发是指在单核CPU上,多个线程占用不同的CPU时间片。线程在物理上还是串行执行的,但是由于每个线程占用的CPU时间片非常短(比如10ms),看起来就像是多个线程都在共同执行一样,这样的场景称作并发…

认识线性调频信号(LFM)和脉冲压缩

目录 1. 线性调频(LFM)信号:2.Matlab仿真3.脉冲压缩 微信公众号获取更多FPGA相关源码: 1. 线性调频(LFM)信号: 在时域中,一个理想的线性调频信号或脉冲持续时间为T秒,…

CNAS认证是什么?怎么做?

在全球化日益深入的今天,产品质量和安全已经成为企业生存和发展的重要基石。而在这个过程中,CNAS认证作为一种权威性的认可机制,发挥着不可替代的作用。那么,CNAS认证究竟是什么?我们又该如何进行这一认证过程呢&#…

派能协议,逆变器测试问题记录

问题一:逆变器无法进行逆变 通过抓取逆变器与bms的通讯报文,如下: 根据派能协议,报文标黄的对应充放电状态,30 30对应的数据为0 0,说明充放电状态全部置0,导致逆变器无法逆变。 问题二&#xf…

安装好IDEA后,就能够直接开始跑代码了吗?

我实习的第一天,睿哥叫我安装了IDEA,然后我就照做了。 之后,我把gitlab的代码拉下来后,发现好像没有编译运行的按钮,所以我就跑去问睿哥。睿哥当时看了看后,发现原来我没有安装JDK,他就叫我安装…

下载elasticsearch-7.10.2教程

1、ES官网下载地址 Elasticsearch:官方分布式搜索和分析引擎 | Elastic 2、点击下载Elasticsearch 3、点击 View past releases,查看过去的版本 4、选择版本 Elasticsearch 7.10.2,点击 Download,进入下载详情 5、点击 LINUX X8…

LeetCode435无重叠区间

题目描述 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 解析 由于要删除尽可能少的区间 ,因此区间跨度大的一定是要先删除的,这样就有两种贪心思想了…

【ARM Cache 及 MMU 系列文章 6.2 -- ARMv8/v9 如何读取 Cache 内部数据并对其进行解析?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Direct access to internal memoryL1 cache encodingsL1 Cache Data 寄存器Cache 数据读取代码实现测试结果Direct access to internal memory 在ARMv8架构中,缓存(Cache)是用来加…

D 25章 进程的终止

D 25章 进程的终止 440 25.1 进程的终止:_exit()和exit() 440 1. _exit(int status), status 定义了终止状态,父进程可调用 wait 获取。仅低8位可用, 调用 _exit() 总是成功的。 2.程序一般不会调用 _exit(), 而是…

海外盲盒APP系统开发:开拓国际盲盒市场

在互联网的传播下,盲盒在国内外都掀起了风潮,我国盲盒将具有文化元素的盲盒商品投向海外市场中,获得了海外消费者的喜爱,给我国盲盒企业提供了新的商业机遇。盲盒的未知性让玩家在拆盲盒的过程中享受到更多的惊喜感,为…

下载kibana-7.10.2教程

1、官网下载地址: Download Kibana Free | Get Started Now | Elastic 2、进入 Kibana下载界面,点击 View past releases 查看过去的版本 3、选择版本 Elasticsearch 7.10.2,点击 Download 4、点击 LINUX 64-BIT,进行下载 5、下…

高并发挑战?盘点这些架构优化篇技巧,让你的系统焕发新生!

高并发挑战?试试这些垂直优化技巧,让你的系统焕发新生! 背景介绍性能优化优化方向架构演进历程第一阶段:单体架构弊端瓶颈Tomcat与数据库独立部署瓶颈 第二阶段:缓存架构结合本地缓存和分布式缓存瓶颈 第三阶段&#x…

PHP简约轻型聊天室留言源码

无名轻聊是一款phptxt的轻型聊天室。 无名轻聊特点: 自适应电脑/手机 数据使用txt存放,默认显示近50条聊天记录 采用jqueryajax轮询方式,适合小型聊天环境。 访问地址加?zhi进入管理模式,发送 clear 清空聊天记录。 修改在…

C++ 23 之 构造函数和析构函数

c23构造函数和析构函数.cpp #include <iostream> #include <string> using namespace std;class Person2{ public:// 构造函数 没有返回值&#xff0c;不能写void;函数名和类名一致&#xff1b;可以设置参数&#xff0c;可以函数重载&#xff1b;系统自动调用&…