Arjuna JTA交易出乎意料地回滚

时间:2012-03-29 12:48:57

标签: java transactions jboss jms

当我检查JBoss日志时,我发现了很多错误

2012-03-29 12:01:27,358 WARN  @ [com.arjuna.ats.jta.logging.loggerI18N] [com.arjuna.ats.internal.jta.resources.arjunacore.norecoveryxa] [com.arjuna.ats.internal.jta.resources.arjunacore.norecoveryxa] Could not find new XAResource to use for recovering non-serializable XAResource < 131075, 32, 30, 1--53e2af7c:eff6:4ec11bf7:2e1da4-53e2af7c:eff6:4ec11bf7:2e263d                                                                   >
2012-03-29 12:01:27,398 WARN  @ [com.arjuna.ats.jta.logging.loggerI18N] [com.arjuna.ats.internal.jta.resources.arjunacore.norecoveryxa] [com.arjuna.ats.internal.jta.resources.arjunacore.norecoveryxa] Could not find new XAResource to use for recovering non-serializable XAResource < 131075, 31, 29, 1--53e2af7c:d397:4e8c1b0e:25b6d-53e2af7c:d397:4e8c1b0e:29d09                                                                     >

然后,当我尝试发送JMS消息时,我看到了这个错误:

2012-03-29 12:02:43,778 WARN  @ [com.arjuna.ats.jta.logging.loggerI18N] [com.arjuna.ats.internal.jta.resources.arjunacore.opcerror] [com.arjuna.ats.internal.jta.resources.arjunacore.opcerror] XAResourceRecord.commit_one_phase caught: java.lang.IllegalMonitorStateException
2012-03-29 12:02:43,778 WARN  @ [org.springframework.jms.listener.DefaultMessageListenerContainer] Setup of JMS message listener invoker failed for destination 'queue/request' - trying to recover. Cause: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException: [com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] [com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] Can't commit because the transaction is in aborted state

我怀疑回滚是上一个错误的结果。我对吗 ?什么可能导致交易保持这样的中止状态?

看着我发现这篇文章:What causes Arjuna 1603 (Could not find new XAResource to use for recovering non-serializable XAResource) 。我知道有一些交易日志已被保留,但这并没有解释如何解决我现在的问题。

4 个答案:

答案 0 :(得分:2)

我在JBoss 5.1上看到过类似的错误(至少是第二个引用超时的错误)

我们没有找到实际原因,但很可能是由于长时间运行的交易导致“收获”

我们得出这个结论的原因是我们在高负荷时看到了这一点,并且一些操作需要很长时间才能完成。

我们使用PostgreSQL并且有很多连接“在事务中等待”,这些连接在收获后被清除。检查配置中的事务超时并将其设置为更高的值,以查看它是否可以缓解此问题。

https://community.jboss.org/wiki/TransactionTimeout介绍了如何管理此设置。

答案 1 :(得分:2)

通常,从托管引发的每个RuntimeException(注入的东西都是用JBoss代理包装的)并且没有标记为@ApplicationException(rollback = false)将导致事务回滚。

这些案例通常很容易在日志文件中看到。

另一方面,超时有点棘手。您将在日志文件中看到类似的内容:“操作的中止标识-3f57fd2d:e48e:4cf8de0f:在多个线程处于活动状态时调用bc。”

其他调用将继续运行,只有当他们尝试访问数据库连接时才会失败,并收到“事务被标记为回滚”异常。

答案 2 :(得分:1)

我们收到了类似的错误,后来发现原因与我们创建和处理实体的方式有关。我们有一个带有子实体列表的父对象,我们正在创建父项的副本,然后尝试将新子项添加到列表中。但问题是这些子列表标有延迟加载注释:

@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY ......

导致hibernate失败。为了解决这个问题,我们在实体上调用了evict,这样Hibernate就会在创建父代副本时停止尝试获取子代。

((Session)entityManager.getDelegate())。逐出(实体到逐出)

这可能不是您特定问题的解决方案,但希望它有助于某人!

答案 3 :(得分:-2)

我们在postgresql.conf文件中解决了将max_prepared_transactions增加到100的问题。