【发布时间】:2014-03-04 05:39:03
【问题描述】:
由于我们在事务中使用了很多 @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 导致
原因:java.sql.SQLException: java.sql.SQLException: XAER_RMFAIL: 全局事务处于IDLE状态时无法执行命令
我们曾经使用 Seam3 托管事务,它似乎工作正常。但它不再适用于 Wildfly。我们尝试了 Deltaspike 的 jpa 模块,但它似乎在围绕多个数据源进行事务处理时出现问题(非 JTA 似乎很好),即使我们遵循了他们的指示。
我们也尝试了@Applicationscoped @TransactionalManagement,但它没有给我们事务。
我在使用 Wildfly 而不是 @Stateful 或 @Statelss @Singleton 等方面有哪些选择?
【问题讨论】:
标签: java transactions jta wildfly