TUXEDO XA功能解决了在分布式事务处理环境中,多个独立数据库操作事务一致性问题。
这些操作可能发生在不同的数据库,一般情况下,某一数据库无法知道其它数据库在做什么,此时由交易中间件通知相关数据库的提交或回滚。
TUXEDO与数据库通过XA接口规范,使用两阶段提交来完成一个全局事务,具体步骤为:
在第一阶段,交易中间件请求所有相关数据库准备提交(预提交)各自的事务分支,以确认是否所有相关数据库都可以提交各自的事务分支。
当某一数据库收到预提交后,如果可以提交属于自己的事务分支,则将自己在该事务分支中所做的操作固定记录下来,并给交易中间件一个同意提交的应答,
此时数据库将不能再在该事务分支中加入任何操作,但此时数据库并没有真正提交该事务,数据库对共享资源的操作还未释放(处于上锁状态)。
如果由于某种原因数据库无法提交属于自己的事务分支,它将回滚自己的所有操作,释放对共享资源上的锁,并返回给交易中间件失败应答。
在第二阶段,交易中间件审查所有数据库返回的预提交结果,如所有数据库都可以提交,交易中间件将要求所有数据库做正式提交,这样该全局事务被提交。
而如果有任一数据库预提交返回失败,交易中间件将要求所有其它数据库回滚其操作,这样该全局事务被回滚。
TUXEDO XA 配置方法:
1、修改$TUXDIR/udataobj/RM 增加
#ORACLE 8.0.5
Oracle_XA:xaosw:-L${ORACLE_HOME}/lib -lclntsh
2、生成TMS FOR ORACLE ,执行
$ buildtms -r Oracle_XA -o /${TUXDIR}/bin/TMS_ORA
3、创建TLOG
在ubb.txt文件的*MACHINS节中加入:
TLOGDEVICE="/usr/tuxedo/TLOG"
TLOGNAME=TLOG
TLOGSIZE=300
用以下命令生成TLOG
$tmadmin -c
> crdl -b1200 -z/usr/tuxedo/TLOG
4、在ubb.txt 配置文件的*GROUPS节中加入
DEFAULT:
TMSNAME=TMS_ORA
TMSCOUNT=2
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/db_username/db_passwd+Sestm=60+SQLNET=aaa+LogDir=."
第二个Oracle_XA:RM中定义的名字
acc=P/数据库用户名/数据库密码
SQLNET=db client连接串
5、重新生成ubb.txt
tmloadcf ubb.txt
6、在编译server时加入-r Oracle_XA选项
buildserver -s SERVICENAME -f a.o -f b.o -o SERVER_EXE_FILENAME -r Oracle_XA
7、oracle数据库准备工作
以Sysadmin登陆数据库,执行如下脚本:
SQL>@$ORACLE_HOME/rdbms/admin/xaview.sql
赋权限给public用户:
SQL>grant select on v$xatrans$ to public with grant option ;
SQL>grant select on v$pending_xatrans$ to public with grant option ;
SQL>grant select on dba_pending_transactions to scott ;
8、tmboot -y 启动时检查TMS_ORA是否成功