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

被折叠的 条评论
为什么被折叠?



