为什么JTA不支持嵌套事务?

11

为什么JTA不支持嵌套事务?是因为实现它们很复杂(我怀疑这一点),还是因为某些设计原则?


有一篇关于嵌套事务、JTA和XA的好文章:http://jbossts.blogspot.com/2009/03/nested-transaction-support.html - Konstantin V. Salikhov
我想知道我所做的是否能帮到你。请在这里查看 https://dev59.com/y2zXa4cB1Zd3GeqPYd7d#14191015 - Siddharth
3个回答

4
JTA规范并未表示它不支持嵌套事务,它只是不要求实现者支持。
以下摘自JTA 1.1规范:
第11页、第13页;3.1 UserTransaction接口3.2 TransactionManager接口

"不必支持嵌套事务。"

第13页,3.2.1 启动事务

"如果事务管理器实现不支持嵌套事务,当调用线程已与事务相关联时, TransactionManager.begin方法会抛出NotSupportedException异常。"

您可能尝试在当前事务中注册的XAResource存在问题(我相信它可能与X/Open XA规范有关): 3.4.4 事务关联

XAResource不支持嵌套事务。在当前已关联其他事务的连接上调用XAResource.start方法是错误的。


这可能是规范中的问题,但是JTA的@Transactional注释不包括NESTED在可能值的列表中。有趣的是,Spring的@Transactional注释包括 - Steve Chambers

3
(正如@Piotr Nowicki所指出的,JTA确实允许嵌套事务,但这是可选的而不是强制性的。)为什么呢?除非你是当时做决定的人之一,否则很难确定答案。可能是包含嵌套事务作为规范的固有复杂性,或者当时的表面复杂性;即他们不确定如何对其进行良好的规范。也可能是他们认为需求不足,时间压力......或者只是纯粹的疲惫。也可能是“商业原因”;例如,某些供应商不希望通过扩大规范的范围来干扰产品发布计划。但是,归根结底,如果您想要真正的答案,您需要问编写JTA规范的工作组中的人员。(我怀疑他们会在记录上告诉你。)

3

这并不是商业答案。

许多容器(例如JBoss)提供了更复杂的替代事务管理器,支持诸如嵌套事务之类的概念,但其他容器(如glassfish)则没有。然而,这两者都符合Java EE规范。其想法是保持规范的简单性,以降低供应商的遵从门槛。

为什么要强制某人实现一个只涵盖0.5%的事务用例或放弃Java EE合规性的复杂事务管理器?

没有任何东西阻止雄心勃勃的供应商超越规范,但他们不能选择留下任何东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接