注册
达梦dbms_xa事务实现使用样例
专栏/db follower/ 文章详情 /

达梦dbms_xa事务实现使用样例

wayne 2023/11/05 1484 6 0
摘要 在达梦数据库中dbms_xa对xa事务是如何进行支持的使用样例,供参考

一、 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的基本函数和过程包括:
image.png
基础的数据类型定义信息如下:
image.png
这里对常用的函数和过程进行说明:

  1. XA_START
    XA_START
    根据指定的 XID 将当前会话与事务分支关联起来。
    语法如下:
    FUNCTION XA_START(
    XID IN DBMS_XA_XID,
    FLAG IN PLS_INTEGER
    )RETURN PLS_INTEGER;
    参数详解
     XID 输入参数,全局事务分支 ID。
     FLAG 输入参数()
  2. XA_END
    根据指定的 XID 将当前会话与事务分支取消关联。
    语法如下:
    FUNCTION XA_END (
    XID IN DBMS_XA_XID,
    FLAG IN PLS_INTEGER
    )RETURN PLS_INTEGER;
    参数详解
     XID 输入参数,全局事务分支 ID。
     FLAG 输入参数。
  3. 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事务的展示
前提条件:

  1. 数据库开启归档
  2. RLOG_APPEND_LOGIC参数调整为4
  3. dmbs_logmnr包已安装
    根据提示,调整参数RLOG_APPEND_LOGIC为4之后,暂时无记录在归档日志中
    image.png
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服