我会尝试描述一下情况。我们有网络服务;对于每个请求,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();
最佳答案
您可以使用一些适当的事务属性创建另一个 bean。该 bean 可以将所有调用委托(delegate)给第一个 bean。
或者您可以从另一个线程调用此 ejb。
关于java - 在事务内进行无事务 EJB 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1381257/