XA 与两阶段提交

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

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

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

 

 

 

 

 

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    239 引用 • 224 回帖 • 1 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 400 关注
  • SQLite

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

    5 引用 • 7 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 2 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    57 引用 • 25 回帖 • 8 关注
  • Docker

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

    494 引用 • 928 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    295 引用 • 750 回帖
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    31 引用 • 97 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    116 引用 • 54 回帖 • 5 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖 • 2 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 20 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖 • 1 关注
  • 房星科技

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

    6 引用 • 141 回帖 • 592 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    21 引用 • 204 回帖
  • RabbitMQ

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

    49 引用 • 60 回帖 • 349 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 655 关注
  • Mobi.css

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

    1 引用 • 6 回帖 • 753 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖
  • 域名

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

    43 引用 • 208 回帖 • 1 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2040 回帖
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 786 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 645 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    133 引用 • 888 回帖 • 1 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖