UserTransaction ut=查找....ut.beginTransaction();saveToFooDB();statelessEjb.transactionSupportedMethod();//向 Foo DB 保存内容 saveToFooDB();ut.commit();

如果我执行上述操作,那么我的理解是它不是 XA 事务,因为它不跨越多个资源(例如 DB 加 JMS)。我的理解正确吗?

有帮助吗?

解决方案

数据源可以配置两种:

  • XA:这些数据源可以参与分布式事务
  • 当地的:也称为非XA,它们不能参与分布式事务

UserTransaction JTA 规范中定义了如何协调分布式事务中的参与者。

然而,实现 JTA 规范的应用程序服务器可以自由地进行大量优化。其中之一是 last-agent-optimization, ,这允许分布式事务的最后一个参与者 当地的. 。然后对最后的参与者进行定期提交。如果只有一名参与者,那么情况总是如此。

简而言之:

  • 如果您有多个参与者,则需要使用 XA 和 2 阶段提交
  • 如果只有一个参与者,大多数应用程序服务器都支持本地数据源,并且不使用完整的两阶段提交协议。

对于玻璃鱼,请参阅:

编辑

glassfish“交易范围”款 文档 比我解释得更好。我想所有应用程序服务器都是一样的。

本地交易只涉及一个 非 XA 资源,并要求所有 参与的应用程序组件 在一个进程内执行。 当地 交易优化是特定的 给资源管理器,并 对 Java EE 透明 申请。

在应用服务器中,JDBC 如果资源符合以下任一条件,则该资源为非 XA 资源 符合以下标准

  • 在 JDBC 连接池配置中,数据源类 不执行 javax.sql.XADataSource 接口。

  • 未选中 "全局事务支持 "方框,或未选中 "资源 "方框。 类型设置不存在或不 设置为 javax.sql.XADataSource。

如果 以下条件仍然成立:

  • 使用一个且仅一个非 XA 资源。如果有任何额外的非 XA 资源被使用,则交易 中止。
  • 不发生事务导入或导出。

涉及多个 资源或多方参与 进程是分布式或全球性的 交易全球交易可以 如果最后一次 代理优化已启用。否则,所有资源都必须是 XA。使用最后试剂优化 属性默认设置为 true。有关如何设置 属性,请参阅配置 交易服务。

如果在一个 会发生单相提交、 否则交易 与两阶段承诺相协调 协议。

其他提示

使用连接工厂被宣布为XA-支持

一旦开始UserTransaction的,然后得到的资源的连接(例如数据库),这意味着连接将成为XA事务的一部分。此外,不要紧,在所有你是否连接到单个或多个类型的资源,例如JMS和数据库。

希望有所帮助。

尼丁

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top