1

是否有一个开源 Java 库可以将 XA 支持添加到本机不支持它的数据库中?也就是说,它包装了一个非 XA JDBC 数据源,并在幕后为两阶段提交处理必要的提交/回滚?

4

1 回答 1

11

不,因为这是不可能的。

让我们回顾一下 XA 旨在实现的目标。它是一种共识协议,用于保证跨多个资源管理器的事务的 ACID 属性。为此,它使用了两阶段提交协议:事务管理器准备每个资源管理器,然后提交每个资源管理器。

为了使协议正确运行,资源管理器(例如数据库)必须在准备阶段做出某些保证。其中包括 a)在提交阶段(“隔离”)之前不让其他进程看到任何更改,b)确保它可以在需要时在提交时执行更新,即使它在准备和提交之间崩溃(“持久性”)和c) 确保在不同事务中操作的数据表现出承诺的一致性属性。实际上,实现这一点的唯一方法是排他锁定。即使是在大多数操作期间使用 MVCC 或其他技术的资源管理器(例如 pgsql 和 oracle)也会在准备时使用排他锁。

如果无法访问数据库内部,您将无法获取锁并跨连接持有它们。因此,您无法编写能够满足事务要求的代码。因此,在数据库引擎之上没有 XA 分层 - 它必须被烘焙。

然而...

您可以伪造 XA 行为的某些方面。根据您的确切应用要求,这可能允许制作有用的解决方案。

首先,您可以使用 Last Resource Optimization(也称为 Last Resource Commit Optimization 或 Last Resource Gambit)将单个非 XA 即一个阶段资源加入到具有一个或多个实际 XA 资源的 XA 事务中。通过在处理顺序中将一个阶段资源排在最后,您可以获得在大多数情况下表现得像 XA 的东西。如果在执行过程中的某些点发生崩溃,它会严重中断,因此您必须自定义编写数据协调代码或依靠人工来处理这种意外情况。取决于您的数据的语义,这可能是一个有吸引力的选择,也可能不是。

接下来,您可以实现与语义复制非常相似的自定义驱动程序。它在准备时将 SQL 操作的序列记录到日志中,但直到提交阶段才真正将它们应用到数据库。这适用于在应用程序级别隔离的事务更新,但如果您依赖数据库为您进行并发控制,则将不起作用。例如,您可能会发现提交失败,因为在准备阶段和提交阶段之间的冲突更新中潜入了其他东西。您可以使用外部锁管理器,但前提是您的自定义驱动程序是唯一与数据库对话的东西。一旦一个不知道锁管理器的客户出现,所有的赌注都被取消了。

Finally, you can invert that model and use compensation based transactions under XA. In this model you apply the updates at prepare time and apply additional operations to reverse their effect in the rollback phase if needed. This has two drawbacks: concurrent operations may read and operate on the prematurely committed values of a tx that later rolls back, as there is no isolation between the prepare and commit; also depending on the business logic it's not easy to generate suitable compensation statements. Even if you can, you need quite a lot of complex plumbing to ensure they are run properly even in crash scenarios.

Realistically you're probably limited to LRCO, which is supported out of the box by most transaction managers. The other options require substantial transactions expertise to get right and the dev/test overhead usually isn't justified. If LRCO won't work for you then frankly it's going to be easier to redesign your app to avoid the need for XA.

于 2011-11-28T16:30:56.237 回答