XA 与两阶段提交

本贴最后更新于 3402 天前,其中的信息可能已经斗转星移

先讲讲两阶段提交把,两阶段提交顾名思义分为两个阶段,一个是准备阶段,一个是提交阶段。

在两阶段提交中有三个参与者,一个是应用程序(向事务管理器提交 commit或者rollback请求),一个是事务管理器(接收应用程序的请求,并协调 多个资源管理器 进行事务提交或者回滚),还有一个就是 资源管理器咯(管理单个资源——数据库,JMS等的事务)

有一个经典的对两阶段的比喻,就是结婚的仪式:

牧师(事务管理器)分别询问新娘、新郎(资源管理器)你是否愿意与对方结婚(第一阶段开始),如果两个人都回答 I do(第一阶段结束,第二阶段开始),那么牧师就会向两位新人宣布,你们的婚姻关系成立了~(第二阶段结束)
如果有异常情况,有一个人say no的话,那么,就结不了婚啦~

两阶段提交的第一阶段存在的意义是 让对应的资源做好一切提交的准备,如果提交不了的话,可以尽快暴露出来(如磁盘空间不足什么的),告诉协调器,让大家一起回滚。

 

一些两阶段提交协议的实现里会有 “最后参与者支持(Last Participant Support)” 或者 “最后资源提交优化(Last Resource Commit Optimization)” 的支持,这个支持允许有 一个 非XA支持的资源参与到全局事务中来,具体是这么实现的~

还是结婚的栗子,不过我们假设中间多了个民政局(非XA资源),在新郎新娘都SAY I DO后(XA的第一阶段结束),牧师问民政局你是否愿意给他们颁发结婚证呀(让非XA资源提交),若民政局颁发证书了(非资源XA提交成功),牧师则宣布婚姻关系成立,若民政局说,你们是失散多年的亲兄妹!好吧,牧师只能说,你们的婚姻关系不成立,散了吧(XA资源回滚)。

上述这个优化项并不建议使用,因为在第一阶段和第二阶段之间必须串行的接入第三阶段,这就增加了事务执行的时间,有一句老话大家都知道的,叫夜长梦多,尤其是在这种网络环境,并且 这个实现 只是 一些 两阶段提交的实现中支持...请理解 一些 的含义...

 

当然,写两阶段协议实现的人都跟你我一样聪明,当事务参与者只有一个的时候,他会从两阶段提交变成一阶段提交,省去询问的提交准备的步骤

 

 

现在我们对两阶段提交有了一个大概整体的了解了,下面我们来分析一下本协议在网络环境中是如何保持一致性。

在协调者发出COMMIT前,参与者总是能通过ROLLBACK恢复到一致性状态的,在此,不再描述。我们着重描述进入 “第二阶段”, 协调者开始发送COMMIT命令的场景

有三个角色 协调者C 部分参与者A 部分参与者B ,A与B加起来就是所有参与者。3个元素任意自由组成组合,一个元素可归属多个组合,组合内元素能正常互访,不同组合元素无法互访(对方挂了,或者与对方的网络中断),那么有以下的组成:

一、总共只有一个组合的情况:

1、ABC三个组成一个组合,这表示ABC都能互相正常互联,两阶段提交正常运行

二、总共只有两个组合的情况:

1) C,AB——参与者可以询问包括自己在内的所有参与者 可提交状态,从而判定应该执行提交还是回滚的结果,从而保证强一致性及可用性。

2) CA,B——A的数据能够明确知道执行结果,能执行回滚或者提交,这部分保持着一致性及可用性。而B因为无从获得提交结果,因此只能阻塞。

3) CB,A——与2)类似。

4) CA,CB——AB都能获得最终的提交结果,能保证一致性。由于消息是可以传递的,因此这个组合等价于 “一、”中全部可互联的情况

5) AC,AB——A能够从C中获得最终的提交结果,B能够从A中获得最终提交结果,因此最终能达到强一致性也保证了可用性。本质上跟4)一致。由于消息是可以传递的,因此这个组合等价于 “一、”中全部可互联的情况

6) BC,BA——与4)类似

总共只有三个组合的情况:

1)A,B,C——好吧,肯定都阻塞,没有异议把....

2)其他的组合……——存在三个或以上的组合的话,无论怎么分通过消息传递后都必然等价于上述已经存在的情况,无需再讨论

 

因此,总结一下,两阶段提交在 部分资源管理器 无法与 协调者互联 且无法与 其他资源管理器互联时,只能阻塞等待 互联恢复,完全失去了 可用性。但在其他情况下,还是能较好的处理异常,消耗部分可用性(从其他资源管理器中获得提交结果,增加了耗时)来维持一致性的。

 

 

好吧,到现在两阶段提交的概念以及一些异常的处理应该都讲的差不多了,那么XA与两阶段提交是啥关系?其实关系很简单,可能大家都猜出来了,XA是基于两阶段提交设计的一个接口标准,实现了这个XA接口的资源管理器那么就能参与到XA管控的全局事务中~好咯,本章完毕 ~

 

 

 

 

 

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 611 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    134 引用 • 797 回帖
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 353 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖 • 4 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    89 引用 • 1251 回帖 • 394 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 3 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 8 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 314 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 496 关注
  • danl
    180 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 710 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 4 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖 • 1 关注
  • Follow
    4 引用 • 12 回帖 • 8 关注
  • OneNote
    1 引用 • 3 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 267 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 28 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 563 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    172 引用 • 540 回帖
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 643 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 242 关注