10

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

4

3 回答 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 方法是错误的。

于 2012-11-14T13:58:18.387 回答
3

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

为什么?这是无法确定回答的问题之一,除非您是做出决定时“在场”的人之一。

  • 这可能是在规范中包含嵌套事务的固有复杂性。或者当时明显的复杂性;即他们不确定他们是否知道如何做好指定它们的工作。

  • 可能是他们认为需求不足。

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

  • 可能是“商业原因”;例如,某些供应商不想通过扩大规范范围来干扰产品发布计划。

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

于 2012-10-08T15:22:08.457 回答
3

答案都不是生意。

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

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

没有什么能阻止雄心勃勃的供应商超越规范,但他们没有选择遗漏任何内容。

于 2012-10-08T15:34:49.483 回答