两阶段提交协议

两阶段提交协议

发布时间:2007年10月12日 作者:act1027

阅读次数:142次 类别:我的文章 永久链接 Trackback 
实现分布式事务的关键就是两阶段提交协议。在此协议中,一个或多个资源管理器的活动均由一个称为事务协调器的单独软件组件来控制。

实现分布式事务的关键就是两阶段提交协议。在此协议中,一个或多个资源管理器的活动均由一个称为事务协调器的单独软件组件来控制。此协议中的五个步骤如下:

应用程序调用事务协调器中的提交方法。

事务协调器将联络事务中涉及的每个资源管理器,并通知它们准备提交事务(这是第一阶段的开始)。

为 了以肯定的方式响应准备阶段,资源管理器必须将自己置于以下状态:确保能在被要求提交事务时提交事务,或在被要求回滚事务时回滚事务。大多数资源管理器会 将包含其计划更改的日记文件(或等效文件)写入持久存储区中。如果资源管理器无法准备事务,它会以一个否定响应来回应事务协调器。

事务协调器收集来自资源管理器的所有响应。

在 第二阶段,事务协调器将事务的结果通知给每个资源管理器。如果任一资源管理器做出否定响应,则事务协调器会将一个回滚命令发送给事务中涉及的所有资源管理 器。如果资源管理器都做出肯定响应,则事务协调器会指示所有的资源管理器提交事务。一旦通知资源管理器提交,此后的事务就不能失败了。通过以肯定的方式响 应第一阶段,每个资源管理器均已确保,如果以后通知它提交事务,则事务不会失败。

图 1 和图 2 通过两个顺序图来说明两阶段提交协议。


图 1 事务提交

图 1 显示事务成功(提交)。图 2 显示由于某种原因,其中一个资源管理器无法提交时的两阶段提交协议。


图 2 事务被回滚

 
### 两阶段提交协议的终止或完成 #### 预备阶段 (Prepare Phase) 在预备阶段,事务协调器向所有参与者发送准备消息。每个接收到此消息的参与者会执行所需的操作并记录下这些操作以便可以回滚或确认。一旦参与者完成了必要的准备工作,则返回给协调器一个肯定的回答表示已准备好提交;如果有任何问题无法继续,则返回否定回答。 对于Flink中的情况,在预提交阶段Sink函数将待写入的数据存储到临时位置,并通知Operator算子已经准备好进行最终提交[^1]。 #### 提交决策阶段 (Commit Decision Phase) 当所有的参与者都回应完毕后: - **如果全部同意**:协调者广播`COMMIT`命令至各节点,指示它们正式提交更改。此时各个参与者按照指令实际地应用之前所做的变更,并释放资源锁等措施来确保整个系统的状态一致。 - **若有任意一方拒绝** 或者超时未得到应答:则由协调者发出`ABORT`信号让所有成员撤销先前做的工作以保持系统的一致性和完整性。 在Flink里,若是所有sink均反馈成功,则operator会触发真正的数据落地动作;反之遇到失败情形就取消此次checkpoint并且回退至上一次成功的检查点重新开始计算流程[^4]。 ```java // 假设这是简化版的Java伪代码展示2PC过程的一部分逻辑 public class TwoPhaseCommitProtocol { public void prepare() throws Exception { // 执行业务逻辑前的准备工作... // 向所有参与者发送PREPARE请求 boolean allVotesGranted = true; for(Participant p : participants){ if(!p.vote()){ allVotesGranted = false; break; } } if(allVotesGranted){ commit(); }else{ abort(); } } private void commit(){ // 发送COMMIT命令给所有参与者 for(Participant p : participants){ p.doCommit(); } } private void abort(){ // 发送ABORT命令给所有参与者 for(Participant p : participants){ p.undoChanges(); } } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值