一、 XA协议说明
XA是一个分布式事务协议,XA规范主要定义事务管理器(Transaction Manager)和资源管理器(Resource Manager)之间的接口。XA接口是双向的系统接口,在事务管理器以及一个或多个资源管理器之间形成通信通道。XA协议采用两阶段(三阶段)提交方式来管理分布式事务,XA提供TM和RM之间的通信标准接口。
二、 DM的XA实现
DM数据库通过提供DBMS_XA包可以对分布式事务进行管理和实现,DBMS_XA包兼容oracle的DBMS_XA包,为应用提供了一种通过PL/SQL调用XA接口的方式。
DBMS_XA的基本函数和过程包括:

基础的数据类型定义信息如下:

这里对常用的函数和过程进行说明:
- XA_START
XA_START
根据指定的 XID 将当前会话与事务分支关联起来。
语法如下:
FUNCTION XA_START(
XID IN DBMS_XA_XID,
FLAG IN PLS_INTEGER
)RETURN PLS_INTEGER;
参数详解
XID 输入参数,全局事务分支 ID。
FLAG 输入参数()
- XA_END
根据指定的 XID 将当前会话与事务分支取消关联。
语法如下:
FUNCTION XA_END (
XID IN DBMS_XA_XID,
FLAG IN PLS_INTEGER
)RETURN PLS_INTEGER;
参数详解
XID 输入参数,全局事务分支 ID。
FLAG 输入参数。
- XA_COMMIT
根据指定的 XID 提交全局事务。
语法如下:
FUNCTION XA_COMMIT (
XID IN DBMS_XA_XID,
ONEPHASE IN BOLLEAN
)RETURN PLS_INTEGER;
参数详解
XID 输入参数,全局事务分支 ID。
ONEPHASE 输入参数,是否一阶段提交。TRUE:一阶段提交; FALSE:两阶段提交。
其中XA_START和XA_END中的输入参数flag取值说明(参照oracle):
TMNOFLAGS:此标识指示创建新的事务分支,一般用于XA_START
TMJOIN:此标识指示会话附加到现有指定的事务分支
三、 DBMS_XA的实现测试
如果之前未创建系统包,则调用存储过程进行创建:
SP_CREATE_SYSTEM_PACKAGES(1,'DBMS_XA');
以下为分布式事务实现的测试过程:
CREATE TABLE TESTXA(C1 INT);
CREATE TABLE TESTXA2(C2 INT);
--session 1 利用TMNOFLAGS创建一个新的事务分支,全局事务ID为1888,并执行插入数据操作,
DECLARE
TESTI INT;
TESTXID DBMS_XA_XID := DBMS_XA_XID(1888);
BEGIN
TESTI := DBMS_XA.XA_START(TESTXID,DBMS_XA.TMNOFLAGS);
DBMS_OUTPUT.PUT_LINE(TESTI);
INSERT INTO TESTXA VALUES(1);
TESTI := DBMS_XA.XA_END(TESTXID,DBMS_XA.TMSUSPEND);
DBMS_OUTPUT.PUT_LINE(TESTI);
END;
/
注:因为是全局事务,所以此语句执行结果插入的数据不是完整事务,所以从session 1查看不到插入的数据,其他会话更查询不到。
--session 2 利用flags为TMJOIN加入全局事务ID为1888的事务,并执行插入数据到另外一个表
DECLARE
TESTI INT;
TESTXID DBMS_XA_XID := DBMS_XA_XID(1888);
BEGIN
TESTI := DBMS_XA.XA_START(TESTXID,DBMS_XA.TMJOIN);
DBMS_OUTPUT.PUT_LINE(TESTI);
INSERT INTO TESTXA2 VALUES(2);
TESTI := DBMS_XA.XA_END(TESTXID,DBMS_XA.TMSUCCESS);
DBMS_OUTPUT.PUT_LINE(TESTI);
END;
/
注:和session 1一样,在session 2中同样看不到插入的数据。
--session 3 利用两阶段提交,对1888的全局事务进行提交
DECLARE
TESTI INT;
TESTXID DBMS_XA_XID := DBMS_XA_XID(1888);
BEGIN
TESTI := DBMS_XA.XA_PREPARE(TESTXID);
DBMS_OUTPUT.PUT_LINE(TESTI);
TESTI := DBMS_XA.XA_COMMIT(TESTXID,FALSE);
DBMS_OUTPUT.PUT_LINE(TESTI);
END;
/
注:此会话是对全局事务的提交,此提交后,所有会话都可以查询到插入的表数据。
四、 XA_COMMIT事务的展示
前提条件:
- 数据库开启归档
- RLOG_APPEND_LOGIC参数调整为4
- dmbs_logmnr包已安装
根据提示,调整参数RLOG_APPEND_LOGIC为4之后,暂时无记录在归档日志中
