如何设计全局分布式事务(无数据库)?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,它是分布式系统的一个众所周知的协议。