XA 与两阶段提交

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

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

在两阶段提交中有三个参与者,一个是应用程序(向事务管理器提交 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管控的全局事务中~好咯,本章完毕 ~

 

 

 

 

 

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    20153 引用 • 77712 回帖 • 2 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 40 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    83 引用 • 165 回帖 • 5 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    536 引用 • 672 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    143 引用 • 3752 回帖
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    123 引用 • 168 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 607 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 194 关注
  • 安装

    你若安好,便是晴天。

    131 引用 • 1184 回帖
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    333 引用 • 619 回帖
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 714 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖
  • 爬虫

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

    106 引用 • 275 回帖
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    14 引用 • 7 回帖 • 4 关注
  • 资讯

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

    54 引用 • 85 回帖 • 1 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 616 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    483 引用 • 906 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 5 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖 • 1 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 725 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 60 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    19 引用 • 31 回帖 • 1 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 705 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 641 关注
  • Sym

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

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

    524 引用 • 4599 回帖 • 701 关注