为什么JTA不支持嵌套事务?是因为实施它们的复杂性(我怀疑)还是一些设计原则?
答案 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合规性的复杂事务管理器?
没有什么可以阻止雄心勃勃的供应商超越规范,但他们没有选择留下任何东西。