为什么JTA不支持嵌套事务

时间:2012-09-23 12:02:08

标签: java java-ee transactions jta nested-transactions

为什么JTA不支持嵌套事务?是因为实施它们的复杂性(我怀疑)还是一些设计原则?

3 个答案:

答案 0 :(得分: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方法   用不同的交易。

答案 1 :(得分:3)

(正如@Piotr Nowicki指出的那样,JTA 确实允许嵌套事务,但这是可选的而不是强制性的。)

为什么呢?这是任何确定无法回答的问题之一,除非你做出决定时是“房间里的人”之一。

  • 将嵌套事务作为规范的一部分包含在内可能是一种固有的复杂性。或者当时显而易见的复杂性;即他们不确定他们是否知道如何做好指定他们的工作

  • 可能他们认为没有足够的需求。

  • 这可能是时间压力......或者只是简单的疲惫。

  • 这可能是“商业原因”;例如某些供应商不希望通过扩大规范范围来干扰产品发布时间表。

但是,最重要的是,如果你想要真正的答案,你需要询问工作组中编写JTA规范的人。 (我怀疑他们会告诉你......记录在案。)

答案 2 :(得分:2)

它的答案都不是商业。

许多容器(如JBoss)提供了更复杂的替代事务管理器,它支持嵌套事务等概念,但像glassfish这样的其他事件却不支持。但这两者都符合Java EE标准。我们的想法是保持规范简单,以降低供应商的合规性障碍。

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

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