【发布时间】:2012-04-05 10:39:21
【问题描述】:
我认为这是一个相当普遍的问题:如何将我的业务逻辑放在分布式系统环境中的全局事务中?举个例子,我有一个包含几个子任务的TaskA:
任务A {subtask1, subtask2, subtask3 ... }
这些子任务中的每一个都可以在本地机器或远程机器上执行,我希望TaskA通过事务以原子方式(成功或失败)执行。每个子任务都有一个回滚函数,一旦TaskA认为操作失败(因为其中一个子任务失败),它就会调用每个子任务的回滚函数。否则 TaskA 提交整个事务。
为此,我遵循“Audit trial”事务模式对每个子任务进行记录,因此TaskA可以知道子任务的操作结果,然后决定回滚或提交。这听起来很简单,但难点在于如何将每个子任务与全局事务关联起来?
当 TaskA 开始时,它会启动一个全局事务,其中子任务一无所知。为了让子任务知道它,我必须将事务上下文传递给子任务的每次调用。这实在是太可怕了!我的子任务要么在新线程中执行,要么通过 AMQP 代理发送消息在远程执行,很难巩固上下文传播的方式。
我做了一些研究,例如“事务模式 - 四种事务相关模式的集合”、“异步消息传递环境中的检查事务”,这些都没有解决我的问题。他们要么没有实际的例子,要么没有解决上下文传播问题。
我想知道人们如何解决这个问题?因为这种事务在企业软件中一定很常见。
X/Open XA 只是解决这个问题的方法吗? JTA 可以在这里提供帮助吗(我没有研究过 JTA,因为它与数据库事务有关,而且我正在使用 Spring,我不想在我的软件中涉及另一个 Java EE 应用程序服务器)。
有专家可以和我分享一些想法吗?谢谢。
结论
Arjan 和 Martin 给出了非常好的答案,谢谢。 最后我没有走这条路。经过更多研究,我选择了另一种模式“CheckPoint”1。
查看我的需求,我发现我的意图是“审核 Trial Transaction Pattern”是为了知道操作进行到了哪个级别,如果它失败了,我可以在重新加载一些上下文后在失败的地方重新启动它。其实这不是事务,失败后并没有回滚其他成功的步骤。这是 CheckPoint 模式的精髓。 然而,学习分布式事务的东西让我学到了很多有趣的东西。除了 Arjan 和 Martin 提到的。我还建议深入研究这个领域的人看看 CORBA,它是分布式系统的著名协议。
【问题讨论】:
-
今天我读了JTA的东西,我认为这是要走的路,我需要实现我的XAResource以集成到全局事务中。这是一个有趣的话题,看起来以前没有多少人做过。我正在继续调查。
-
事实上,由于 RMI/IIOP,Java 服务器之间的 EJB 调用“几乎”是 CORBA。有些供应商符合 CORBA,有些则不。
标签: java jta distributed-transactions