由于我们在事务中使用了大量 @ApplicationScoped bean,但我们不想使用 EJB(ApplicationScoped bean 不适用于无状态 bean),因此我们创建自己的事务拦截器,例如:
@Resource
UserTransaction tx;
@Resource(mappedName="java:jboss/TransactionSynchronizationRegistry")
TransactionSynchronizationRegistry tsr;
@AroundInvoke
public Object manageTransaction(InvocationContext context) throws Exception {
Object result;
if (Status.STATUS_NO_TRANSACTION == tsr.getTransactionStatus()) {
tx.begin();
// System.out.println("Starting transaction");
result = context.proceed();
tx.commit();
} else {
result = context.proceed();
}
// System.out.println("Committing transaction");
return result;
}
然而,在 JTA 事务的情况下,我们遇到了如下错误:
使用自己的 TransactionInterceptor 导致
Caused by: java.sql.SQLException: java.sql.SQLException: XAER_RMFAIL: 当全局事务处于 IDLE 状态时,该命令无法执行
我们曾经使用 Seam3 托管事务,它看起来工作正常。但它在 Wildfly 中不再起作用了。我们尝试了 Deltaspike 的 jpa 模块,但即使我们遵循了他们的指示,围绕多个数据源的事务似乎也存在问题(非 JTA 似乎没问题)。
我们还尝试了 @Applicationscoped @TransactionalManagement 但它没有给我们事务。
使用 Wildfly 但不使用 @Stateful 或 @Statelss @Singleton 等时我有什么选择?
你有没有尝试过javax.transaction.Transactional
(Java EE 7 中的新功能)?
@ApplicationScoped
@Transactional
public MyTransactionalBean {
// ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)