`
samuschen
  • 浏览: 398515 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

两阶段提交协议

 
阅读更多

转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  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics