如何设计全局分布式事务(无数据库)?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存档的资源适配器。根据资源的类型,以下方面需要读取/实现:
- XAResource接口
- JCA Java Connector Architecture主要是在涉及远程连接的情况下
- 如果需要在节点之间传播事务,则使用JTS事务服务
作为示例,我建议您查看经典的“与文件进行交易”问题的实现: