两阶段提交协议

本文深入探讨了分布式事务中两阶段提交的机制,包括预提交阶段和正式提交阶段。详细解释了如何通过检查各数据库的预提交结果来决定全局事务的最终状态。并通过伪代码展示了实现过程。

转http://vvggsky.iteye.com/blog/438634

 

在第一阶段,交易中间件请求所有相关数据库准备提交(预提交)各自的事务分支,以确认是否所有相关数据库都可以提交各自的事务分支。当某一数据库收到预提 交后,如果可以提交属于自己的事务分支,则将自己在该事务分支中所做的操作固定记录下来,并给交易中间件一个同意提交的应答,此时数据库将不能再在该事务 分支中加入任何操作,但此时数据库并没有真正提交该事务,数据库对共享资源的操作还未释放(处于锁定状态)。如果由于某种原因数据库无法提交属于自己的事 务分支,它将回滚自己的所有操作,释放对共享资源上的锁,并返回给交易中间件失败应答。

在第二阶段,交易中间件审查所有数据库返回的预提交结果,如所有数据库都可以提交,交易中间件将要求所有数据库做正式提交,这样该全局事务被提交。而如果有任一数据库预提交返回失败,交易中间件将要求所有其它数据库回滚其操作,这样该全局事务被回滚。

伪代码:


假设有两个Connection, con1, con2, 大体的过程如下,

Java代码   收藏代码
  1. con1 = XAResouce1.getConnection...  
  2. con2 = XAResouce2.getConnection...  
  3.   
  4. con1 do  some thing.  
  5. con2 do  some thing.  
  6. after they finish.  
  7.   
  8. pre1 = XAResouce1.prepare();  
  9. pre2 = XAResouce2.prepare();  
  10.   
  11. if ( both pre1 and pre2 are OK){  
  12. XAResouce1 and 2  commit  
  13. }else  {  
  14. XAResouce1 and 2  rollback  

### 两阶段提交协议的终止或完成 #### 预备阶段 (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(); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值