#DBMS_XA
DBMS_XA包提供了一组常量、数据结构和函数,用于在PL中调用XA接口。
DBMS_XA包仅适用于单机部署。
使用DBMS_XA包的数据结构和函数需要EXECUTE ANY TYPE和EXECUTE ANY PROCEDURE系统权限。
# DBMS_XA数据结构
DBMS_XA包中使用自定义类型数据结构作为函数参数或返回值。
# DBMS_XA_XID OBJECT TYPE
TYPE DBMS_XA_XID IS OBJECT(
formatid NUMBER,
gtrid RAW(64),
bqual RAW(64),
constructor function DBMS_XA_XID(
formatid IN NUMBER,
gtrid IN RAW,
bqual IN RAW)
RETURN SELF AS RESULT)
YashanDB提供的DBMS_XA_XID是一种UDT类型主体,使用构造函数时必须输入全部3种参数,参数描述如下:
参数 | 描述 |
---|---|
formatid | 格式标识符,兼容参数,无实际意义 |
gtrid | 全局标识符,唯一区分全局事务,最大为64字节,字段末尾的0会被忽略(即'12300100'等同于'123001') |
bqual | 分支限定符,最大为64字节,字段末尾的0会被忽略(即'12300100'等同于'123001') |
# DBMS_XA_XID_ARRAY TABLE TYPE
YashanDB提供的DBMS_XA_XID_ARRAY是一种嵌套表类型的UDT。
TYPE DBMS_XA_XID_ARRAY as TABLE of DBMS_XA_XID
# DBMS_XA常量
DBMS_XA高级包中定义了一些常量,用作函数参数或返回值。
下表列示了可作为XA_START和XA_END函数的参数使用的常量。
名称 | 类型 | 数值 | 描述 |
---|---|---|---|
TMNOFLAGS | PLS_INTEGER | 00000000 | 表示未选择标志位值 |
TMSUCCESS | PLS_INTEGER | 0x04000000 | 挂起事务分支并取消调用者和事务分支的关联 |
TMJOIN | PLS_INTEGER | 0x00200000 | 调用者加入已存在的事务分支 |
TMSUSPEND | PLS_INTEGER | 0x02000000 | 仅挂起当前事务分支 |
TMRESUME | PLS_INTEGER | 0x08000000 | 等同于TMJOIN |
下表列示了DBMS_XA包中函数可能的常量返回值。
名称 | 类型 | 数值 | 描述 |
---|---|---|---|
XA_OK | PLS_INTEGER | 0 | 正常执行 |
XAER_ASYNC | PLS_INTEGER | -2 | 异步操作未完成 |
XAER_RMERR | PLS_INTEGER | -3 | 事务分支中资源管理器报错 |
XAER_NOTA | PLS_INTEGER | -4 | XID无效 |
XAER_INVAL | PLS_INTEGER | -5 | 参数无效 |
XAER_PROTO | PLS_INTEGER | -6 | 调用上下文关系不恰当 |
XAER_RMFAIL | PLS_INTEGER | -7 | 资源管理器当前不可用 |
XAER_DUPID | PLS_INTEGER | -8 | 已存在指定的XID |
XAER_OUTSIDE | PLS_INTEGER | -9 | 资源管理器正在执行全局事务以外的工作 |
XAER_PXACT | PLS_INTEGER | -10 | 并行事务不能转成XA事务 |
# DBMS_XA函数
# XA_START
DBMS_XA.XA_START(
xid IN DBMS_XA_XID,
flag IN INTEGER)
RETURN PLS_INTEGER;
XA_START函数用于关联当前会话和xid指定的事务分支。
XA_START函数的flag参数只能为TMNOFLAGS、TMJOIN或TMRESUME中的一种。若flag为TMNOFLAGS,将启动一个新的事务分支,否则,当前会话将关联已存在的事务分支。
参数 | 描述 |
---|---|
xid | 指定事务分支。 |
flag | 标志位常量。 |
示例(单机部署)
-- 声明DBMS_XA_XID类型变量并调用XA_START函数
DECLARE
ret INT;
xid DBMS_XA_XID := DBMS_XA_XID(1, HEXTORAW('1'), HEXTORAW('1'));
BEGIN
ret := DBMS_XA.XA_START(xid, DBMS_XA.TMNOFLAGS);
END;
/
# XA_END
DBMS_XA.XA_END(
xid IN DBMS_XA_XID,
flag IN INTEGER)
RETURN PLS_INTEGER;
XA_END函数用于结束当前会话和xid指定的事务分支关联。
XA_END函数的flag参数只能为TMNOFLAGS、TMSUCCESS或TMSUSPEND中的一种,TMNOFLAGS等价于TMSUSPEND。
函数成功返回后,事务分支仍存在。
参数 | 描述 |
---|---|
xid | 指定事务分支。 |
flag | 标志位常量。 |
示例(单机部署)
-- 声明DBMS_XA_XID类型变量并调用XA_END函数
DECLARE
ret INT;
xid DBMS_XA_XID := DBMS_XA_XID(1, HEXTORAW('1'), HEXTORAW('1'));
BEGIN
ret := DBMS_XA.XA_END(xid, DBMS_XA.TMNOFLAGS);
END;
/
# XA_PREPARE
DBMS_XA.XA_PREPARE(
xid IN DBMS_XA_XID)
RETURN PLS_INTEGER;
XA_PREPARE函数用于准备提交xid指定的事务分支。
参数 | 描述 |
---|---|
xid | 指定事务分支。 |
示例(单机部署)
-- 声明DBMS_XA_XID类型变量并调用XA_PREPARE函数
DECLARE
ret INT;
xid DBMS_XA_XID := DBMS_XA_XID(1, HEXTORAW('1'), HEXTORAW('1'));
BEGIN
ret := DBMS_XA.XA_PREPARE(xid);
END;
/
# XA_COMMIT
DBMS_XA.XA_COMMIT(
xid IN DBMS_XA_XID,
onePhase IN BOOLEAN)
RETURN PLS_INTEGER;
XA_COMMIT函数用于提交xid指定的事务分支。
若onePhase参数值为TRUE,资源管理器应使用一阶段协议来代表xid进行提交。
XA事务中不能执行COMMIT语句。
参数 | 描述 |
---|---|
xid | 指定事务分支。 |
onePhase | 指定是否应用一阶段提交。 |
示例(单机部署)
-- 声明DBMS_XA_XID类型变量并调用XA_COMMIT函数
DECLARE
ret INT;
xid DBMS_XA_XID := DBMS_XA_XID(1, HEXTORAW('1'), HEXTORAW('1'));
BEGIN
ret := DBMS_XA.XA_COMMIT(xid, false);
END;
/
# XA_RECOVER
DBMS_XA.XA_RECOVER
RETURN DBMS_XA_XID_ARRAY;
XA_RECOVER函数用于从资源管理器(RM)获得已准备好的或完成的事务分支列表。
formatid查询结果恒为0。
示例(单机部署)
-- 声明DBMS_XA_XID_ARRAY类型变量并调用XA_RECOVER函数
DECLARE
xid_array DBMS_XA_XID_ARRAY;
BEGIN
xid_array := DBMS_XA.XA_RECOVER();
END;
/
# XA_FORGET
DBMS_XA.XA_FORGET(
xid IN DBMS_XA_XID)
RETURN PLS_INTEGER;
XA_FORGET函数用于通知资源管理器(RM)丢弃提交或回滚的事务分支。
参数 | 描述 |
---|---|
xid | 指定事务分支。 |
示例(单机部署)
-- 声明DBMS_XA_XID类型变量并调用XA_FORGET函数
DECLARE
ret INT;
xid DBMS_XA_XID := DBMS_XA_XID(1, HEXTORAW('1'), HEXTORAW('1'));
BEGIN
ret := DBMS_XA.XA_FORGET(xid);
END;
/
# XA_ROLLBACK
DBMS_XA.XA_ROLLBACK(
xid IN DBMS_XA_XID)
RETURN PLS_INTEGER;
XA_ROLLBACK函数用于通知资源管理器(RM)回滚事务分支。
XA事务中不建议执行ROLLBACK语句。
参数 | 描述 |
---|---|
xid | 指定事务分支。 |
示例(单机部署)
-- 声明DBMS_XA_XID类型变量并调用XA_ROLLBACK函数
DECLARE
ret INT;
xid DBMS_XA_XID := DBMS_XA_XID(1, HEXTORAW('1'), HEXTORAW('1'));
BEGIN
ret := DBMS_XA.XA_ROLLBACK(xid);
END;
/