基于 XA 事务协议,用代码实现一个二阶段分布式事务

本文介绍了基于XA事务协议的二阶段提交实现,详细讲解了DTP模型与XA规范,涉及TM、RM和AP的角色。通过MySQL数据库的XA事务支持,演示了如何在分布式环境中进行事务管理,特别是现金+红包支付的模拟案例。
摘要由CSDN通过智能技术生成

在上篇《漫谈分布式事务的那些解决方案》文章中,我提到了分布式事务的三种通用解决方案,但是没有具体的代码实现,有少小伙伴留言说原理知道了,但是还是不会写代码,那么这篇文章就简单聊一聊基于 XA 事务协议,用代码来实现二阶段提交。

在具体的 Demo 之前,先来补充一点 XA 事务的知识:DTP 模型与 XA 规范

DTP 模型与 XA 规范是由 X/Open 维护,也就是现在的 open group,官方网址:http://www.opengroup.org/。open group 是一个独立的组织,主要负责制定各种行业技术标准。由各大知名公司或者厂商进行支持,主要有如下公司:

open group 目前有八家公司,华为就是其中的一家。在分布式事务处理(Distributed Transaction Processing,简称DTP)方面,X/Open主要提供了以下参考文档:

  • DTP 参考模型: https://pubs.opengroup.org/onlinepubs/9294999599/toc.pdf
  • DTP XA规范: https://pubs.opengroup.org/onlinepubs/009680699/toc.pdf

DTP 模型

在《Distributed Transaction Processing: Reference Model 》 第3版中,规定了构成 DTP 模型的 5个基本元素:

  • 应用程序(Application Program ,简称AP):用于定义事务边界(即定义事务的开始和结束),并且在事务边界内对资源进行操作,可以简单理解为我们的应用程序。
  • 资源管理器(Resource Manager,简称RM):如数据库、文件系统等,并提供访问资源的方式。
  • 事务管理器(Transaction Manager ,简称TM):负责分配事务唯一标识,监控事务的执行进度,并负责事务的提交、回滚等。
  • 通信资源管理器(Communication Resource Manager,简称CRM):控制一个TM域(TM domain)内或者跨TM域的分布式应用之间的通信。
  • 通信协议(Communication Protocol,简称CP):提供CRM提供的分布式应用节点之间的底层通信服务。

DTP 模型元素更深层次的东西可以参考 opengroup 的文档,接下来聊一聊 DTP 实例,一个 DTP 实例至少包含 AP、RMs、TM 三部分。如下图所示:

我们可以看出 AP、RMs、TM 三者之间都是有交互的,大概流程如下:

  • AP 从 RMs 中获取数据库资源,个人认为可以简单的理解成一条数据库链接,就像我们常用的数据连接一样。
  • TM 事务资源管理器,负责分配事务唯一标识,监控事务的执行进程,并负责事务的提交、回滚等。AP 会将自己的事务绑定到 TM 中,剩下的事情就交给 TM了。
  • TM 根据收集的结果告诉 RMs(具体的数据库,例如 MySQL ) 是执行回滚还是提交。

那什么是 XA 协议呢?XA 规范是定义交互接口,从上面的图中可以看出,整个 DTP 中,有三个交互接口,XA 规范主要是 TM 和 RMs 之间。下面这张图好理解一些:

好了,关于 DTP 模型与 XA 规范就聊这么多,具体的可以查看 opengroup 提供的文档,下面就用我们熟悉的 MySQL 数据库来实现一个 XA 事务协议的二阶段提交。

MySQL 从5.0.3开始支持XA分布式事务,且只有InnoDB存储引擎支持。入下图:

在 MySQL数据库官网有一个模块专门讲 XA 事务,具体可以查看:

https://dev.mysql.com/doc/refman/5.7/en/xa.html。

其他的我就不说了,这里我提一下 XA 事务状态,一个完整的事务流程如下:

  • 1.使用 XA START 来启动一个 XA 事务,并把它置于 ACTIVE 状态。
  • 2.对于一个 ACTIVE 状态的 XA 事务,我们可以执行构成事务的 SQL 语句,然后发布一个 XA END 语句。XA END 把事务放入 IDLE状态。
  • 3.对于一个IDLE 状态XA事务,可以执行一个 XA PREPARE 语句或一个XA COMMIT…ONE PHASE 语句:
    • XA PREPARE 把事务放入 PREPARED 状态。在此点上的 XA RECOVER 语句将在其输出中包括事务的 xid 值,因为 XA RECOVER 会列出处于 PREPARED 状态的所有 XA 事务。
    • XA COMMIT…ONE PHASE 用于预备和提交事务。xid 值将不会被 XA RECOVER 列出,因为事务终止。
  • 对于一个 PREPARED 状态的 XA事务,您可以发布一个 XA COMMIT 语句来提交和终止事务,或者发布XA ROLLBACK来回滚并终止事务。

总结一下,XA 事务,通过 Start 启动一个 XA 事务,并且被置为 Active 状态,处在 active 状态的事务可以执行 SQL 语句,通过 END 方法将 XA 事务置为 IDLE 状态。处于 IDLE 状态可以执行 PREPARE 操作或者 COMMIT…ONE PHASE 操作,也就是二阶段提交中的第一阶段,PREPARED 状态的 XA事务的时候就可以 Commit 或者 RollBack,也就是二阶段提交的第二阶段

可能你注意到了上面有一个 XID 值,简单的讲一下,MySQL 中使用xid来作为一个事务分支的标识符。关于

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值