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)