UserTransaction ut = lookup .... ut.beginTransaction(); saveToFooDB(); statelessEjb.transactionSupportedMethod(); //将内容保存到Foo DB saveToFooDB(); ut.commit();
如果我正在执行上述操作,那么我的理解是它不是XA事务,因为它不跨越多个资源(如DB加JMS)。我的理解是否正确?
答案 0 :(得分:3)
数据源可以配置为两种:
JTA规范中定义了UserTransaction
,它描述了如何在分布式事务中协调参与者。
实现JTA规范的应用程序服务器可以自由地进行大量优化。其中一个是last-agent-optimization
,它允许分布式事务中的最后一个参与者本地。然后为最后的参与者进行常规提交。如果只有一个参与者,那么情况总是如此。
简而言之:
对于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和数据库等单一或多种类型的资源,都无关紧要。
希望有所帮助。
尼丁