如何设计全局分布式事务(无数据库)?JTA可以用于无数据库事务吗?


问题内容

我认为这是一个相当普遍的问题:如何将我的业务逻辑放在分布式系统环境中的全局事务中?举一个例子,我有一个TaskA包含几个子任务:

TaskA {subtask1,subtask2,subtask3 …}

这些子任务中的每一个都可以在本地计算机或远程计算机上执行,我希望TaskA通过事务以原子方式(成功或失败)执行。每个子任务都具有回滚功能,一旦TaskA认为操作失败(因为子任务之一失败),它将调用子任务的每个回滚功能。否则,TaskA将提交整个事务。

为此,我遵循“审计试用”事务模式为每个子任务都有一个记录,因此TaskA可以知道子任务的操作结果,然后决定回滚或提交。这听起来很简单,但是,难点在于如何将每个子任务与全局事务相关联?

TaskA开始时,它将启动一个全局事务,该事务关于哪个子任务什么都不知道。为了使子任务意识到这一点,我必须将事务上下文传递给子任务的每次调用。真是可怕!我的子任务可以在新线程中执行,也可以通过AMQP代理发送消息在远程中执行,这很难巩固上下文传播的方式。

我做了一些研究,例如“事务模式-
四个与事务相关的模式的集合”,“在异步消息传递环境中检查事务”,这些都不能解决我的问题。他们要么没有实际的例子,要么没有解决上下文传播问题。

我想知道人们如何解决这个问题?因为这种交易必须在企业软件中很常见。

X / Open
XA只是解决方案吗?JTA可以在这里提供帮助吗(我没有研究JTA​​,因为大多数东西都与数据库事务有关,并且我正在使用Spring,我不想在我的软件中使用其他Java
EE应用服务器)。

可以和我分享一些想法吗?谢谢。

结论

Arjan和Martin给出了非常好的答案,谢谢。 最终,我没有采用这种方式。经过更多研究,我选择了另一个模式“ CheckPoint
1

查看我的需求后,我发现“审核试用事务模式”的目的是要知道操作已进行到哪个级别,如果失败了,我可以在重新加载某些上下文后在失败的地方重新启动它。实际上这不是事务,失败后没有回滚其他成功步骤。这是CheckPoint模式的本质。但是,研究分布式事务的东西使我学到了很多有趣的东西。除了Arjan和Martin提到的内容。我还建议深入研究此领域的人们看看CORBA,它是分布式系统的著名协议。


问题答案:

没错,由于JTA API提供了XA事务管理器,因此需要两阶段提交支持。

据我所知,Spring本身并不提供事务管理器实现。该JtaTransactionManager中唯一的代表,以通常的JavaEE实现提供现有的实现。

因此,您必须将JTA实现插入Spring才能完成有效的工作。以下是一些建议:

然后,您将必须实现资源管理器以支持两阶段提交。在JavaEE世界中,它包含一个打包为RAR存档的资源适配器。根据资源的类型,以下方面需要读取/实现:

作为示例,我建议您查看经典的“与文件进行交易”问题的实现: