首页 » OceanBase » Oceanbase 分布事务XA注意事项

Oceanbase 分布事务XA注意事项

分布式事务是指涉及多个独立资源或服务的事务操作,这些资源通常分布在不同的物理节点上。分布式事务需要保证所有参与的资源要么全部提交,要么全部回滚。XA事务是一种实现分布式事务的具体协议和规范,由X/Open组织提出。它定义了全局事务管理器与局部资源管理器之间的接口。XA事务是分布式事务的一种具体实现方式,分布式事务可以通过XA实现,也可以通过其他方式(如TCC、SAGA等)实现,XA事务由于使用两阶段提交,性能开销较大, Oceanbase中兼容了Oracle的XA事务,支持使用dbms_xa 包。

Oceanbase中使用 XA 功能时,事务管理器将使用 XA 资源实例来准备和协调每个事务分支,然后适当地提交或回滚所有事务分支。XA 功能的关键组件包括 XA 数据源、XA 连接、XA 资源和事务 ID。概念参考分布式事务概述.

在早期的OB V3版本存在一些问题,如XA异常返回值未被应用捕捉,而影响了业务一致性逻辑;和连接未释放或事务未正常结束问题,尤其在使用oceanbase-client-2.4.7.1驱动时。

XA 连接实例与池连接实例一样,封装了与数据库的物理连接。每个 XA 连接实例还具有生成 OracleXAResource 实例的功能,该实例将与之相对应以用于协调分布式事务。OceanBase Connector/J 使用 OracleXAConnection 类实现 XAConnection 接口,OracleXAConnection 类还扩展了 OraclePooledConnection 类。XA 连接实例返回的 OceanBase Connector/J 连接实例充当物理连接的临时句柄,而不是封装物理连接。物理连接由 XA 连接实例封装。与常规连接完全相同,XA 连接从 XAConnection 对象获得连接的行为,直至参与到全局事务为止

每次调用 XA 连接实例的 getConnection 方法时,都会返回一个表现出默认行为的新连接实例,并关闭以前存在的并由同一 XA 连接实例返回的所有以前的连接实例。但是,建议在打开新的连接实例之前显式关闭先前的连接实例。

调用 XA 连接实例的 close 方法将关闭与数据库的物理连接,并通常在中间层执行

将分布式事务与产生此 OracleXAResource 实例的 XA 连接实例中运行的事务分支关联和解除关联。本质上,是将分布式事务与 XA 连接实例封装的物理连接或会话相关联。这是通过使用事务 ID 来完成的。

使用 Oracle XA 功能必须导入以下内容:

import oracle.jdbc.xa.OracleXid;
import oracle.jdbc.xa.OracleXAException;
import oracle.jdbc.pool.*;
import oracle.jdbc.xa.client.*;
import javax.transaction.xa.*;

官方分布式事务示例

OracleXAResource 方法功能和输入参数

Prepare

在 xid 指定的事务分支中准备执行的更改。这是两阶段提交操作的第一阶段,以确保可以访问数据库并且可以成功提交更改。语法如下:

int prepare(Xid xid)

此方法返回一个整数值,如下所示:

  • XAResource.XA_RDONLY如果事务分支仅运行只读操作(例如 SELECT 语句),则返回此值。
  • XAResource.XA_OK如果事务分支运行所有准备就绪且没有错误的更新,则返回此值。
  • NA(不返回任何值)如果事务分支运行更新,如果其中任何一个在准备过程中遇到错误,则不返回任何值。在这种情况下,将引发 XA 异常。

Note:
这里通常返回0 和3,而早期版本有返回100的现象,导致不会以为是EXCEPTION,使用XAexception未捕捉到,影响了应用程序中逻辑的判断。在oceanbase-client-2.4.7.3已解决。可通过配置URL参数添加 oracleXaPrepareThrowException=TRUE开关进行控制。同时该驱动也解决了,在Client在收到网络中断如I/O socket异常时,相关资源未释放的问题,如同ORACLE中的CDC或OS 的tcp keepalive探测后关闭资源的释放。 个人感觉应该是client connect pool ,proxy, ob server 连接不同步的问题。

 

— over —

打赏

目前这篇文章还没有评论(Rss)

我要评论