2

UserTransaction ut=lookup.... ut.beginTransaction(); saveToFooDB(); statelessEjb.transactionSupportedMethod(); //将某些内容保存到 Foo DB saveToFooDB(); ut.commit();

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

4

2 回答 2

3

数据源可以配置为两种:

  • XA:这些数据源可以参与分布式事务
  • Local:也叫非XA,不能参与分布式事务

UserTransaction是在 JTA 规范中定义的,它描述了如何协调分布式事务中的参与者。

然而,实现 JTA 规范的应用服务器可以自由地进行很多优化。其中之一是last-agent-optimization,它允许分布式事务中的最后一个参与者是Local。然后为最后的参与者进行定期提交。如果只有一个参与者,那么总是如此。

简而言之:

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

对于 Glassfish,请参阅:

编辑

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

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

在 Application Server 中,如果 JDBC 资源满足以下任何条件,则它是非 XA 资源:

  • 在 JDBC 连接池配置中,DataSource 类没有实现 javax.sql.XADataSource 接口。

  • 未选中 Global Transaction Support 框,或者 Resource Type 设置不存在或未设置为 javax.sql.XADataSource。

如果以下条件仍然成立,则事务保持本地:

  • 使用一种且仅一种非 XA 资源。如果使用了任何其他非 XA 资源,则事务将中止。
  • 没有交易导入或导出发生。

涉及多个资源或多个参与进程的事务是分布式事务或全局事务。如果启用了最后一个代理优化,则全局事务可能涉及一个非 XA 资源。否则,所有资源都必须是 XA。默认情况下,use-last-agent-optimization 属性设置为 true。有关如何设置此属性的详细信息,请参见配置事务服务。

如果事务中只使用一个 XA 资源,则发生一阶段提交,否则事务与两阶段提交协议协调。

于 2010-03-11T14:15:03.157 回答
0

一旦启动 UserTransaction,然后使用声明为支持 xa 的连接工厂获得到资源(例如数据库)的连接,这意味着该连接将成为 XA 事务的一部分。此外,您连接到单一或多种类型的资源(如 JMS 和数据库)都没有关系。

希望有帮助。

尼丁

于 2011-07-29T19:05:13.957 回答