---
title: OceanBase 数据库 V4.x 版本的 XA 事务基本运维-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于 OceanBase 数据库 V4.x 版本的 XA 事务基本运维相关的常见问题和使用技巧，帮助您快速解决 OceanBase 数据库 V4.x 版本的 XA 事务基本运维的难题。
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# OceanBase 数据库 V4.x 版本的 XA 事务基本运维

更新时间：2024-07-04 07:41

适用版本： V4.1.x、V4.2.x 内容类型：TechNote  

在 XA 事务运维中，可通过查询视图 `gv$ob_transaction_participants` 来获取到一个事务上下文是否为 XA 事务所涉及的事务上下文。

具体语句如下：

```shell
obclient> SELECT * FROM gv$ob_transaction_participants WHERE GLOBALID <> 'NULL';

```

## 悬挂 XA 事务

XA 事务执行完 XA 协议两阶段提交的第一阶段（xa prepare），但是未执行 XA 协议两阶段提交的第二阶段（xa commit）。

在系统租户下，可以通过以下方法来获取所有租户的悬挂 XA 事务的部分关键信息。

```shell
SELECT * FROM gv$ob_transaction_participants
WHERE GLOBALID <> 'NULL'
  AND state = 'REDO COMPLETE'
  AND last_request_time < date_sub(now(), INTERVAL 600 SECOND);

```

获取协调者上下文信息

```shell
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 块来回滚事务：

![1](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/transaction-management/basic-operation-and-maintenance-of-xa-transactions.png)

```shell
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 事务。

```shell
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 及之后版本。

上一篇

[出现悬挂事务，并且日志伴随 4013 报错](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000002398336)

下一篇

[WRS 相关问题排查](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000001014248) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
