如果我访问UserTransaction这是否意味着我使用2阶段提交或XA?

时间:2010-03-10 01:29:20

标签: database java-ee jta distributed-transactions 2phase-commit

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

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

2 个答案:

答案 0 :(得分:3)

数据源可以配置为两种:

  • XA :这些数据源可以参与分发交易
  • 本地:也称为非XA,他们无法参与分布式事务

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

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

简而言之:

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

对于Glassfish,请参阅:

修改

glassfish documentation的段落“交易范围”比我更好地解释了它。我猜这对所有应用服务器来说都是一样的。

  

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

     

在Application Server中,一个JDBC   如果资源满足任何一个,则资源是非XA的   以下标准:

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

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

  •   
     

如果是,交易仍然是本地的   以下条件仍然适用:

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

涉及多个的交易   资源或多个参与者   流程是分布式的或全球性的   交易。全局交易可以   如果最后一个涉及一个非XA资源   已启用代理优化。   否则,所有resourced必须是XA。   use-last-agent-optimization   property默认设置为true。   有关如何设置此的详细信息   属性,请参阅配置   交易服务。

     

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

答案 1 :(得分:0)

一旦启动UserTransaction,然后使用声明为xa-supportive的连接工厂获取与资源(例如数据库)的连接,则意味着连接将成为XA事务的一部分。此外,无论您是连接到JMS和数据库等单一或多种类型的资源,都无关紧要。

希望有所帮助。

尼丁