Wildfly 8.0.0.Final JTA交易问题

时间:2014-03-04 05:39:03

标签: java transactions jta wildfly

由于我们在事务中使用了很多@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等?

1 个答案:

答案 0 :(得分:1)

您是否尝试过javax.transaction.Transactional(Java EE 7中的新增功能)?

@ApplicationScoped
@Transactional
public MyTransactionalBean {
    // ...
}