一、XA概念
要了解XA,先了解分布式事务处理(Distributed Transaction Processing,DTP),DTP指的是在分布式计算环境中,管理和协调多个用户和多个数据库等共享资源之间的交互的过程。DTP是TP的一种形式,在这种形式中,一个事务通常要跨越两个以上的主机和数据库系统,这样的事务被称为分布式事务。目前,大多数平台软件和数据库厂商大的产品都遵循X/OPEN DTP模型中定义的书屋处理规范。所有,这里我以X/OPEN的DTP参考模型为例,去了解分布式事务。模型如图所示:
DTP模型的工作流程如下。①AP(应用程序)通过TM(事务管理器)提供的接口向TM发出请求,以开始一个全局事务,这时TM就会分配一个GTRID来对这个事务进行标识;②AP在事务上下文中使用ESQL来访问RM(资源管理器),以处理业务逻辑;③TM与每一个参与全局事务的RM交换事务信息,当收到AP发出的结束事务的指令时,TM就会通过XA接口向各个RM发出指令,并通过两阶段提交协议来结束全局事务。
而XA就是DTP参考模型中定义接口。RM和TM之间的双向接口!由RM实现,供TM调用。
XA(Extended Architecture)接口规范为资源管理器(RM)和事务管理器(TM)之间定义了双向的通信接口,它由资源管理器实现,共事务管理器调用。XA接口允许事务管理器通过程序的方式,对参与分布式事务的管理资源器进行管理,它是两阶段提交协议的基础。
这个接口规定了两套函数。第一套具有xa_*()形式,由资源管理器实现,被事务管理器使用;第二套具有ax_*()形式,由事务管理器实现,被资源管理器使用,如表,列出了标准XA函数以及功能。
二、TMS的编译配置
提到TMS的编译配置,当然得知道分布式系统在TUXEDO系统中是如何实现的呢?,如图下图所示,是一个TUXEDO系统的事务模型!
TUXEDO的一个核心是TPM。TPM接受AP发出的XATMI指令,并通过一组TMS管理着全局事务,执行两个阶段提交协议。
在上图中,客户机连接到TUXEDO之后,通过XATMI指令来初始化一个全局事务。当TPM收到这个指令后,就会在公告板中创建一个事务,并向GTT中插入一个条目,然后分配一个GIRID来对它进行跟踪。在全局事务上下文中,客户机通过ATMI指令向Server1和Server2发出了调用请求,这两个服务器又使用ESQL分别对Oracle和Informix两个数据库进行了访问。两个事务管理器TMS_ORA和TMS_INF通过XID来对数据库事务分支。TMS_ORA作为事务协调器,使用TLOG来记录全局事务的状态。
TUXEDO的事务管理器是由TMS完成的,TMS是一组独立于业务进程的特殊管理进程,它不仅可以把各种RM接入到TUXEDO的��布式计算环境钟来,可能代表TPM对RM执行事务跟踪和两阶段提交。TMS与进程组是紧密关联的,如下图所示。当进程组被激活时,与它关联的TMS就会自动启动多个实例, 这些实例或执行tpopen(3c)打开和RM的连接,并且从一个消息队列中等待着TPM发出的指令。
了解了TUXEDO对分布式的实现之后,那么TUXEDO的事务配置是如何配的呢?TUXEDO提供了一些参数,可以对事务系统的行为进行控制。在*RESOURCES段中可以配置的事务参数有MAXGTT和CMTRET。
MAXGTT 100
MAXGTT用于设置在同一台主机上,同一时刻最多可以存在的全局事务数,最小值可取0,最大值可取32768,默认值为100,0表示不支持全局事务。如果在*MACHIENS段中也设置了这个参数,它将覆盖*RESOURCES中的取值。
CMTRET COMPLETE
CMTRET用于为事务提交控制参数TP_COMMIT_CONTROL设置初始值,用于控制事务在两阶段提交过程中的行为。CMTRET可取值LOGGED和COMPLETE,默认值是COMPLETE。取值LOGGED相当于使用tpscmt(3c)把TP_COMMIT_CONTROL设置为TP_CMT_LOGGED,表示应用程序发出的事务提交请求在2PC的第一个阶段结之后就会返回。
在*MACHINES段中可以设置的参数有TLOGNAME、TLOGDEVICE 和 TLOGSIZE��
TLOGNAME、TLOGDEVICE 、 TLOGSIZE。
TLOGNAME用于指定事务在设备上的文件名,通常是TLOG;TLOGDEVICE用于指定事务设备的绝对路径名;TLOGSIZE用于指定事务设备占用的磁盘块或分页数,一个分页的大小为512KB,最小可取0,最大值可取2048,默认值为100
在*GROUPS段中可以设置的事务参数有TMSNAME、TMSCOUNT、OPENINFO和CLOSEINFO。
TMSNAME、TMSCOUNT、OPENINFO、CLOSEINFO
TMSNAME用于指定和一个进程组关联的事务管理服务器;TMSCOUNT用于指定TMS的数量,取值必须大于2;OPENINFO用于指定打开RM所必须的参数,CLOSEINFO用于指定关闭RM必须的参数,一般的RM通常不要求提供CLOSEINFO。
一个进程组同时只能和一个TMS关联,下面的例子定义了两个进程组GRP_ORA和GRP_INF,他们分别于Oracle和INFORMIX数据库关联:
*GROUPS
GRP_ORA LIMID=SITE1 GRPNO=1
TMSNAME=TMS_ORA TMSCOUNT=2
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tiger+SesTm=120+MaxCur=5+LogDir=."
GRP_INF LMID=SITE1 GRPNO=2
TMSNAME=TMS_INF TMSCOUNT=2
OPENINFO="INFORMIX-Online:demo"
在*SERVICES段中可以设置的事务参数有AUTOTRAN和TRANSTIME
AUTOTRAN=N
用于指定当前服务是否应该在事务环境中执行,可取Y或N。默认值为N
把AUTOTRAN设置为Y,即如果客户机在事务上下文中调用 服务时,服务队RM的操作会自动纳入到客户机的事务上下文中;如果客户机没有在事务上下文中调用服务,则TUXEDO的事务系统会自动启动一个事务,并让服务在里面执行。
把AUTOTRAN设置为N,即如果客户机在事物上下文中调用服务时,服务队RM的操作会自动纳入客户机的事务;如果客户机没有在事务上下文中调用服务,那么服务将在非事务环境中被调用。
TRANSTIME=30
以秒为单位,指定自动事务的超时时间,取值在0~MAXLONG之间。如果不指定,默认值为30秒,0表示事务超时由当期那主机支持的最大超时决定。