XA 协议简介

XA协议是X/Open组织为分布式事务处理制定的标准,确保分布式事务具备ACID特性。它定义了资源管理器(RM)、事务管理器(TM)及应用程序(AP)的角色,并规范了它们之间的交互流程。RM负责维护数据一致性,TM协调事务的提交或回滚。

XA是X/Open组织为DTP(分布式事务处理)制定的标准协议。XA的目的是保证分布式事务的ACID特性,就像本地事务一样。

XA协议主要定义了三种角色:
ü RM,资源管理器,典型的例如Oracle数据库
ü TM,事务管理器,典型的例如CICS
ü AP,访问RM的应用程序,并通过TX接口访问TM,提交和结束分布式事务。

RM最重要的特定是能够在故障发生后恢复到故障发生前的一致状态,例如关系型数据库、事务队列以及支持事务的文件系统等(NTFS支持事务,FAT32不支持事务),同时它还必须实现了XA协议要求的接口函数。Oracle数据库就是一种RM。
在分布式事务中RM维护自己的事务分支,在TM的要求下准备提交、提交或者回滚事务分支。

TPM是个完整的产品,处理AP发起的事务请求,管理分布式事务中RM的状态,最重要的是控制事务的结束,也就是要求所有参与到分布式事务的RM都提交或者回滚本地事务分支。TM是TPM的一部分,通过两阶段提交方式实现了这个功能。
TM和RM之间的通信接口就是XA协议。RM实现XA协议要求的接口函数,TM调用这些接口函数来管理各个RM中的事务分支,例如要求RM准备提交事务分支等。
TPM和AP之间的接口不在XA协议范围内,由各个TPM供应商自己提供,通常包括允许AP发起分布式事务、提交分布式事务和回滚分布式事务。

AP就是访问RM的应用程序。AP访问RM的接口函数由RM供应商自己提供。当AP需要发起一个包含了多个RM的分布式事务时,它通常需要调用TM提供的API。有些TM支持隐式地发起分布式事务。当AP需要结束事务时,它也要调用TM提供的API。因此AP不能直接在RM上发起或者结束事务,而是通过TM来处理。

XA协议要求RM实现某些函数(xa_*)以及提供数据结构、库文件等信息
函数 作用 备注
xa_open 连接到RM 不同的RM厂商要求不同格式的字符串
xa_close 从RM断开 不同的RM厂商要求不同格式的字符串
xa_start 发起一个分布式事务,给与一个事务ID。或者将某个process关联到已存在的分布式事务
xa_end 将process从关联的分布式事务中剥离
xa_prepare 要求参与到分布式事务的RM准备提交事务分支 2PC的第1阶段
xa_commit 要求参与到分布式事务的RM提交事务分支 2PC的第2阶段
xa_rollback 要求参与到分布式事务的RM回滚事务分支 2PC的第2阶段
xa_forget 要求参与到分布式事务的RM丢弃事务分支信息
xa_recover 从RM获取prepared状态、已提交或者已回滚(但是事务信息还没丢弃)的事务列表 TM崩溃?

xa_switch_t结构
struct xa_switch_t {
char name[RMNAMESZ]; /* name of resource manager /
long flags; /
options specific to the resource manager /
long version; /
must be 0 */
int (*xa_open_entry)(char , int, long); / xa_open function pointer */
int (*xa_close_entry)(char , int, long); / xa_close function pointer */
int (*xa_start_entry)(XID , int, long); / xa_start function pointer */
int (*xa_end_entry)(XID , int, long); / xa_end function pointer */
int (xa_rollback_entry)(XID , int, long); / xa_rollback function pointer/
int (*xa_prepare_entry)(XID , int, long); / xa_prepare function pointer */
int (*xa_commit_entry)(XID , int, long); / xa_commit function pointer */
int (*xa_recover_entry)(XID , long, int, long); / xa_recover function pointer */
int (*xa_forget_entry)(XID , int, long); / xa_forget function pointer */
int (*xa_complete_entry)(int , int , int, long); / xa_complete function pointer/
};

xa信息 备注
xa_switch_t结构 这个结构中包含了RM提供的xa_*函数的地址以及其他信息
Oracle静态注册使用的外部变量名是xaosw,动态注册使用xaoswd
xa_switch_t名称 xa_switch_t结构中的第一个field,用于标识RM名称。
Oracle的RM名称就是Oracle_XA
xa_open字符串 连接到RM时提供的信息,例如用户名、密码以及数据库名等。不同类型的RM有不同的格式要求
xa_close字符串 从RM断开时提供的信息。
Oracle不使用xa_close字符串。
xa library Oracle动态注册的话要rebuild genclntsh库文件

Oracle的xa_open字符串有特定格式:ORACLE_XA{+required_fields…} [+optional_fields…]
 ORACLE_XA是保留关键字
 有必须项和可选项,各项之间用+隔离
XAOpen=“Oracle_XA+ACC=P/system/oracle+SqlNet=cloud+SesTm=30+LogDir=/tmp/xa+DbgFl=1+DB=cloud”

必须项 作用
ACC=P/system/oracle 登录数据库的用户名和密码
SesTm=30 事务分支的空闲时间。在规定时间内事务分支没有新的请求,或者没有结束,就自动回滚。0意味着没有限制

可选项 作用
SqlNet 登录到目标数据库的tns名称。如果要登录多个数据库,这是必须项。
DB pc程序中通过AT关键字来指定执行sql语句的数据库,不指定的话就是在缺省数据库上执行。如果要登录多个数据库,只有1个数据库不用指定DB,其他数据库必须指定DB。
LogDir 存放xa trace文件的目录。注意目录权限
DbgFl xa tracefile的详细程度。0x1记录TM调用和退出标准xa_*函数,0x2记录TM调用和退出非标准XA函数,0x4记录XA库调用的其他函数,例如OCI等。以上flag可以同时使用。
MaxCur xa_open连接到数据库后分配的cursor数量。作用和Proc的maxopencursors参数相同,但是优先级更高。
SesWt 等待其他会话占用事务分支的时间间隔。超时就返回XA_RETRY
Threads TM是否采用多线程连接到数据库

通过XA发起的分布式事务不仅在dba_2pc_pendings和dba_2pc_neighbors中有纪录,在dba_pending_transactions和v g l o b a l t r a n s a c t i o n 中也有纪录。 v global_transaction中也有纪录。 v globaltransaction中也有纪录。vglobal_transaction中记录所有active状态的分布式事务,dba_pending_transaction中记录所有prepared状态的分布式事务。xa_open字符串中指定的数据库用户必须能够查询dba_pending_transaction。
在dba_2pc_*中记录的通过XA发起的分布式事务和通过dblink发起的分布式事务有不同:
 dba_2pc_neighbors的DBID字段总是xa_orcl,DBUSER_OWNER字段总是db_namexa.oracle.com。其中db_name就是xa_open字符串中的DB项。
处理未决事务是TM的责任,仅在特殊情况下才需要dba干预。人工干预的方法由TPM供应商决定,通常的可以参考由dblink发起的分布式事务遭遇未决状态时的处理过程。

缺省情况下RAC支持将同一个分布式事务的不同分支分布到不同实例上。每个实例的GLOBAL_TXN_PROCESSES参数定义了GTXn后台进程的初始数量,缺省值是1。Oracle会根据负载自动调整GTXn的实际数量。将GLOBAL_TXN_PROCESSES设置为0就禁止了XA事务。
在Oracle11g之前不同实例上的事务分支采用松耦合。为了支持紧耦合,必须采用DTP Service,也就是通过运行在某个实例上的service来访问数据库。这样不同的事务分支就必定在相同的实例上。为了让不同分布式事务的事务分支分散到多个实例上,需要定义多个DTP Service,并且在不同的实例上运行。采用DTP Service增加了管理复杂度,但是有助于分布式事务的完整性。因为所有分支都在一个实例上,一旦这个实例发生故障,数据库执行实例恢复,不需要TM检测和参与。并且DTP Service也转移到其他实例上。
从Oracle11g开始不同实例上的事务分支缺省就采用紧耦合。但是同一个分布式事务的不同的事务分支还是最好运行在同一个实例上。这可以通过定义service,并且指定DTP属性(-x true,缺省为false)来实现。

转自:XA协议

<think> 嗯,用户这次明确要求了解XA协议的定义,结合对话历史,之前已经讨论过分布式事务和Seata的不同模式,其中提到XA模式基于XA协议实现两阶段提交。用户现在聚焦在协议本身的定义上,可能是为了深入理解底层原理。 从提供的引用材料看,[^1][^2][^3]都给出了XA协议的关键信息:它是X/Open组织制定的分布式事务处理规范,核心是定义了事务管理器(TM)和资源管理器(RM)之间的交互接口。特别注意到引用[^2]提到XA协议常被误解为“eXtended Architecture”的缩写,但实际与CD-ROM架构无关,这点需要澄清。 用户可能混淆了“协议”和“实现”的区别。引用[^4]指出XA方案存在性能问题,这正好解释了为什么Seata要优化传统XA——不过用户当前问题不涉及这部分,可以暂不展开。 需要强调三个核心角色:AP应用程序通过TX接口操作TM,TM通过XA接口控制多个RM。两阶段提交流程(准备阶段和提交阶段)是协议的核心机制,这点在引用[^1][^4]都有印证。考虑到用户刚接触概念,避免直接列出xa_start等函数细节,先用流程图说明交互逻辑更易懂。 另外发现文献中对“X/Open DTP”的表述不一致:引用[^1]称“DTP group”,引用[^3]称“DTP model”。经查证应为X/Open组织发布的分布式事务处理参考模型,统一采用“DTP模型”的表述更准确。 最后补充一个易忽略点:XA协议实际包含两套函数规范(xa_和ax_前缀),后者用于RM动态注册,这对理解TM如何管理多数据源很重要,但用户没问实现细节就先提一句即可。 </think>### XA协议的定义与核心机制 XA协议是由**X/Open组织**制定的**分布式事务处理规范**,定义了事务管理器(TM)与资源管理器(RM)之间的交互接口,用于协调跨多个资源(如数据库)的分布式事务[^1][^2][^3]。其核心设计如下: #### 一、核心角色 | 角色 | 职责 | |-----------------------|----------------------------------------------------------------------| | **应用程序 (AP)** | 发起全局事务,通过TX接口调用事务管理器(TM) | | **事务管理器 (TM)** | 协调全局事务,管理分支事务的提交/回滚 | | **资源管理器 (RM)** | 控制本地事务(如数据库),执行XA协议指令(如`xa_prepare`)[^1][^3] | #### 二、协议核心流程:两阶段提交(2PC) ```mermaid sequenceDiagram AP->>TM: 开启全局事务 TM->>RM1: xa_start (启动分支事务) RM1->>TM: 执行本地SQL(未提交) TM->>RM2: xa_start (启动分支事务) RM2->>TM: 执行本地SQL(未提交) TM->>所有RM: xa_prepare (询问就绪状态) alt 所有RM返回"就绪" TM->>所有RM: xa_commit (提交事务) else 任一RM返回"失败" TM->>所有RM: xa_rollback (回滚事务) end ``` *▲ 两阶段提交流程:第一阶段(Prepare)锁定资源,第二阶段(Commit/Rollback)最终操作[^2][^4]* #### 三、XA接口函数分类 1. **事务控制函数** - `xa_start()`:启动分支事务 - `xa_end()`:结束分支事务 - `xa_prepare()`:询问RM是否可提交(关键预提交阶段) - `xa_commit()`:提交事务 - `xa_rollback()`:回滚事务 2. **动态管理函数**(`ax_`前缀) - `ax_reg()`:RM向TM动态注册 - `ax_unreg()`:RM从TM注销 - 用于管理全局事务ID(XID)[^2] #### 四、协议特点与限制 | 特性 | 说明 | |---------------------|----------------------------------------------------------------------| | **强一致性** | 所有分支事务要么全部提交,要么全部回滚 | | **资源锁定时间长** | 从`xa_prepare`到`xa_commit`期间持续锁资源,影响并发性能[^4] | | **数据库支持要求** | 需数据库原生支持XA协议(如Oracle、MySQL InnoDB) | | **单点故障风险** | TM宕机可能导致事务阻塞 | > 💡 **关键定义总结**: > XA协议是通过**标准化接口**(如`xa_commit`/`xa_rollback`)实现**跨资源强一致性**的分布式事务规范,其本质是**两阶段提交的标准化实现**[^1][^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈振阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值