为什么 JTA 不支持嵌套事务?是因为实现它们的复杂性(我对此表示怀疑)还是一些设计原则?
3 回答
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 方法是错误的。
(正如@Piotr Nowicki 指出的那样,JTA确实允许嵌套事务,但这是可选的而非强制性的。)
为什么?这是无法确定回答的问题之一,除非您是做出决定时“在场”的人之一。
这可能是在规范中包含嵌套事务的固有复杂性。或者当时明显的复杂性;即他们不确定他们是否知道如何做好指定它们的工作。
可能是他们认为需求不足。
这可能是时间压力......或者只是简单的疲惫。
可能是“商业原因”;例如,某些供应商不想通过扩大规范范围来干扰产品发布计划。
但是,底线是,如果您想要真正的答案,您需要询问编写 JTA 规范的工作组中的人员。(我怀疑他们会告诉你......记录在案。)
答案都不是生意。
许多容器(如 JBoss)提供了更复杂的替代事务管理器,它们支持嵌套事务等概念,但 glassfish 等其他容器不支持。然而,这两者都符合 Java EE。这个想法是保持规范简单,以降低供应商的合规障碍。
为什么要强制某人实施仅涵盖 0.5% 事务用例的复杂事务管理器或放弃 Java EE 合规性?
没有什么能阻止雄心勃勃的供应商超越规范,但他们没有选择遗漏任何内容。