3

这与 Jboss AS 7.1 有关,我们一直在使用它为我们的一个应用程序创建 EJB,

我们的应用程序架构是这样的,所有业务逻辑都存在于存储过程中,我们从 EJB 调用存储过程,我们有一个问题,其中有一组要调用的过程,这些都构成一个原子操作。例如,假设必须提交用户详细信息,在这种情况下,我们必须调用 7 个不同的过程,每个过程插入、更新不同的表并将结果返回给 EJB,因此如果其中一个调用失败,则所有详细信息必须撤消在先前操作之一中插入或更新的操作。我们了解到,这可以通过引入交易来实现。

所以我们尝试在 Jboss 中使用 TransactionManager

public ClsXDKRTApp() throws NamingException {
    tx1 = new TransactionManagerLocator().getTM("java:jboss/TransactionManager");
}

上面的 tx1 被定义为 bean Class 的一个属性,并且它正确地实例化。

但是一旦我们尝试开始交易,我们就会遇到以下错误

 11:28:08,201 ERROR [stderr] (http--0.0.0.0-8080-1) javax.transaction.NotSupportedException: BaseTransaction.checkTransactionState - ARJUNA016051: thread is already associated with a transaction!
 11:28:08,201 ERROR [stderr] (http--0.0.0.0-8080-1)     at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.begin(BaseTransaction.java:63)
 11:28:08,201 ERROR [stderr] (http--0.0.0.0-8080-1)     at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.begin(BaseTransactionManagerDelegate.java:65)

我们已经检查了不同的论坛以寻求解决方案,但提到的用例与这个截然不同。

有关如何处理和解决此问题的任何指导都将非常有帮助

4

1 回答 1

0

如果 EJB 是容器管理的,那么将有默认事务,您可以在同一个调用中调用不同的过程(确保不要在过程中编写提交/回滚),并且 EJB 容器将自动处理完整的事务

于 2014-06-27T06:33:35.420 回答