在不同的线程中回滚事务异常。

15

我在我的Wildfly 10应用服务器上配置了2个xa-datasources,并使用Hibernate ORM 5.2.9。数据库是Postgres 9.6。

在我的应用程序中,我有一个EJB,其中有2个嵌套的for循环,我必须在每个嵌套循环的迭代中从一个表中读取数据。但是过一段时间后,我遇到了这个异常:

javax.ejb.EJBTransactionRolledbackException: org.hibernate.HibernateException: Transaction was rolled back in a different thread!

我不明白为什么会发生这种情况。我有一个小的概念验证应用程序,它使用JDBC连接到数据库,一切都正常。

编辑 这是在抛出我提到的异常后的堆栈跟踪:

12:39:07,319 警告 [com.arjuna.ats.arjuna] (默认任务-7) ARJUNA012077: 在已中止的原子操作上调用了Abort 0:ffffac280184:2edc54df:598adfb2:27f 12:39:07,320 错误 [org.jboss.as.ejb3.invocation] (默认任务-7) WFLYEJB0034: 组件ejb/calculationResource上的EJB调用失败,方法为public void com.actuariado.smartsolve.services.api.calculation.CalculationResource.calculateFinancial(org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput) throws com.actuariado.smartsolve.exceptions.AppException: javax.ejb.EJBTransactionRolledbackException: 事务已回滚 at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleEndTransactionException(CMTTxInterceptor.java:137) at org.jboss.as.ejb3.tx.CMTTxInterceptor.endTransaction(CMTTxInterceptor.java:117) at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:279) at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:327) at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:239) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.component.invocationmetrics.WaitTimeInterceptor.processInvocation(WaitTimeInterceptor.java:47) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.java:100) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.deployment.processors.StartupAwaitInterceptor.processInvocation(StartupAwaitInterceptor.java:22) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:64) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:67) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:54) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:64) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356) at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:636) at org.jboss.invocation.AccessCheckingInterceptor.processInvocation(AccessCheckingInterceptor.java:61) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356) at org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.java:80) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:198) at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:185) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) at org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:73) at com.actuariado.smartsolve.services.api.calculation.C


你对此事有更多信息吗?你绝对确定你的交易没有被回滚吗? - M. Prokhorov
M. Prokhorov - 我已经编辑了问题以包含堆栈跟踪。希望这能为您提供更多信息。谢谢! - GoAlves
在这个事务内部,您是否可能对此容器中的EJB进行远程调用? - aschoerk
我不这么认为。我的所有EJB都是本地的。 - GoAlves
1个回答

10

我想我已经弄清楚了发生了什么。 看起来,当调用我的EJB方法时,容器会创建一个全局的JTA事务(或类似的东西),它有5分钟的超时时间(来自Wildfly的默认值)。 由于我的业务逻辑(嵌套循环)需要处理的时间超过了这个时间,事务超时并且在我再次尝试访问数据库时抛出异常。


4
你是如何解决这个问题的? - Ivandro Jao
@IvandroJao 你解决了这个问题吗? - Denis Babochenko
3
没错。我也遇到了同样的问题,解决方法是增加 Wildfly 事务的超时时间。为此,请编辑 standalone.xml 文件并在事务子系统对象中添加一个超时属性:<subsystem xmlns="urn:jboss:domain:transactions:4.0"> 只需添加以下行:<coordinator-environment default-timeout="6000"/> 其中 6000 是等待事务响应的最大秒数数量。 - William Cuervo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接