XA 与两阶段提交

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

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

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

 

 

 

 

 

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • OpenResty

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

    17 引用 • 53 关注
  • DevOps

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

    58 引用 • 25 回帖 • 4 关注
  • Outlook
    1 引用 • 5 回帖 • 1 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 117 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    21 引用 • 245 回帖 • 228 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 81 关注
  • 996
    13 引用 • 200 回帖 • 8 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 107 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 113 关注
  • gRpc
    11 引用 • 9 回帖 • 92 关注
  • 思源笔记

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

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

    25482 引用 • 105378 回帖
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 702 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 727 关注
  • FFmpeg

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

    23 引用 • 32 回帖
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 1 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 3 关注
  • Access
    1 引用 • 3 回帖 • 1 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 740 关注
  • QQ

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

    45 引用 • 557 回帖 • 1 关注
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖 • 1 关注
  • Wide

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

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

    30 引用 • 218 回帖 • 636 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 504 关注
  • OneDrive
    2 引用
  • 强迫症

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

    15 引用 • 161 回帖 • 1 关注