|
2
|
| Ittai · 技术社区 · 15 年前 |
|
|
1
2
ConnectionFactory和XAConnectionFactory之间的区别的核心在于,XAConnectionFactory创建创建XASessions的XAConnections。XASessions代表真正的区别,因为(引用 JMS JavaDocs :)
换句话说,XASession使XA实例具有事务意识。但是,即使对于完全兼容的JMS提供程序,此特定实现也是可选的。来自同一个JavaDoc: XAResource为在多个事务上交错工作、恢复正在进行的事务列表等提供了一些相当复杂的工具。支持JTA的JMS提供程序必须完全实现此功能。这可以通过使用支持XA的数据库的服务来实现,或者JMS提供者可以选择从头开始实现此功能。 换句话说,提供者可能要求您指定一个XA或非XA JMS资源,或者,就像在您的情况下一样,提供者可以透明地执行所有JTA管道 . |
|
2
1
实际上,您提供的任何示例代码都不会执行XA功能。如果所需的只是消息处于同步点下,那么您可以通过一阶段提交(1PC)来完成。但是,如果您希望,例如,JMS消息和DB更新发生在一个协调的工作单元中,那么您将使用两阶段提交(2PC),即XA。在同一个传输提供程序上跨两个消息生产者进行协调不需要XA 2PC。 如果您使用的是2PC,那么除了提交和回滚之外,您还可以在代码的某个地方调用BEGIN。在你的例子中缺少这个动词,这就是为什么我说你看起来不像在做2PC,BEGIN调用将与事务管理器通信,以便在参与的资源管理器之间建立一个事务上下文。然后提交将导致消息 和 数据库在一个工作单元中更新以完成。有趣的是,如果你只有一个参与的资源管理器,一些传输会悄悄地将你优化回1PC。在这种情况下,看起来你是在做2PC,但实际上是在得到1PC。因为只有一个资源管理器,没有在这个优化的可靠性损失。 另一方面,如果你做的是1PC,你不会看到任何区别,这两种类型的连接工厂。它将展示你所描述的行为。
|