在 XA 事务运维中,可通过查询视图 gv$ob_transaction_participants 来获取到一个事务上下文是否为 XA 事务所涉及的事务上下文。
具体语句如下:
obclient> SELECT * FROM gv$ob_transaction_participants WHERE GLOBALID <> 'NULL';
悬挂 XA 事务
XA 事务执行完 XA 协议两阶段提交的第一阶段(xa prepare),但是未执行 XA 协议两阶段提交的第二阶段(xa commit)。
在系统租户下,可以通过以下方法来获取所有租户的悬挂 XA 事务的部分关键信息。
SELECT * FROM gv$ob_transaction_participants
WHERE GLOBALID <> 'NULL'
AND state = 'REDO COMPLETE'
AND last_request_time < date_sub(now(), INTERVAL 600 SECOND);
获取协调者上下文信息
SELECT * FROM gv$ob_transaction_participants
WHERE GLOBALID <> 'NULL'
AND state = 'REDO COMPLETE'
AND COORD = LS_ID;
回滚悬挂 XA 事务
假如通过查询悬挂 XA 事务,获取到 XA 事务的 GLOBALID 为 2020,BRANCHID 为 0101,FORMATID 为 40。在对应的通过普通租户通过执行以下 PL 块来回滚事务:

declare
rc PLS_INTEGER;
begin
rc := DBMS_XA.XA_ROLLBACK(DBMS_XA_XID(40,'2020','101'));
DBMS_OUTPUT.PUT_LINE('xa rollback: ' || rc);
end;
/
批量回滚悬挂 XA 事务
如果系统中存在大量悬挂事务,可以通过以下 PL 块来批量回滚悬挂 XA 事务。
在用户租户下,执行以下语句来批量回滚悬挂 XA 事务。
set serveroutput on;
DECLARE
CURSOR cur
IS
SELECT
GLOBALID gtrid,
BRANCHID bqual,
FORMATID formatid
FROM gv$ob_transaction_participants
WHERE ROLE = 'LEADER'
AND GLOBALID is not NULL
AND state = 'REDO COMPLETE'
AND COORD = LS_ID;
l_xid DBMS_XA_XID := DBMS_XA_XID(0, '', '');
l_ret PLS_INTEGER;
BEGIN
FOR rec IN cur
LOOP
l_xid.formatid := rec.formatid;
l_xid.gtrid := hextoraw(rec.gtrid);
l_xid.bqual := hextoraw(rec.bqual);
l_ret := DBMS_XA.XA_ROLLBACK(xid => l_xid);
dbms_output.put_line(l_ret);
END LOOP;
END;
/
适用版本
OceanBase 数据库 V4.1.x 及之后版本。