我会试着描述一下情况。我们有一个网络服务;在每个请求 Web 服务启动一个 JTA 事务。它通过其中的 XA 数据源执行几个数据库调用,并调用一些其他 Web 服务(在事务上下文之外),还在其他服务器上进行几个远程 EJB 调用。
问题是容器似乎试图将 EJB 纳入事务(这似乎合乎逻辑),但实际上我希望它不参与该事务,因为当它确实参与该事务时,它总是在最终提交阶段超时,但是当我排除 EJB 调用时它工作正常。
我不能更改 EJB 实现,只能控制 Web 服务代码。所以,我的问题是:如何对事务感知 EJB 进行 EJB 调用,但在我的 JTA 事务之外,但仍处于其他 XA 资源的 JTA 事务中?我希望我把我的问题说清楚了:)。
编辑:试图通过伪代码示例使其更清晰:
// Begin transaction
UserTransaction tx = (UserTransaction) ctx.lookup(USER_TRANSACTION);
tx.begin();
// Do some database operations on XA datasource
// Call remote EJB which has transcation attribute set to 'Supports'
AccountInfo account = accountEjb.getAccountInfo(userId, accountId); // <-- Is it possible to make this to be not be part of user transction?
// Do some more database operations on XA datasource
// Commit transaction
tx.commit();