阿朱纳JTA事务意外回滚

10
当我检查 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)。我理解某些事务日志已经被保留,但这并不解释如何修复我现在遇到的问题。

我有同样的问题。有人能告诉我如何解决吗? - Eazy
4个回答

3

通常情况下,从被管理的bean(注入了JBoss代理的东西)抛出的任何RuntimeException,如果没有标记为@ApplicationException(rollback = false),都会导致事务回滚。

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

另一方面,超时则有点棘手。你会在日志文件中看到类似于:“Abort of action id -3f57fd2d:e48e:4cf8de0f:bc invoked while multiple threads active within it.”的内容。

其他调用将继续运行,并且只有当它们尝试访问数据库连接时才会失败,接收到“transaction is marked for rollback”异常。


2
我曾在JBoss 5.1上看到过类似的错误(至少第二个错误与超时有关)。
我们没有找到实际原因,但很可能是由于长时间运行的事务被“收割”引起的。
我们得出这个结论的原因是,在高负载时,一些操作需要很长时间才能完成。
我们使用PostgreSQL,并且有很多连接处于“等待事务”的状态,在“收割”后得到了清除。检查配置中的事务超时并将其设置为更高的值,以查看是否可以缓解问题。 https://community.jboss.org/wiki/TransactionTimeout介绍了如何管理此设置。

1
我们遇到了类似的错误,后来发现问题与我们创建和处理实体的方式有关。我们有一个父对象,带有一组子实体,并且我们正在创建父对象的副本,然后尝试向列表中添加新的子实体。问题在于,这些子实体列表被标记为懒加载注释:

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

这导致Hibernate失败。为了解决这个问题,我们需要在实体上调用evict,以便Hibernate停止在我们创建父对象副本时尝试获取子实体。

((Session) entityManager.getDelegate()).evict(entity to evict)

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

-2

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


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