有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Arjuna JTA事务意外回滚

当我查看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) 个答案

  1. # 1 楼答案

    我们解决了将postgresql中的max_prepared_事务增加到100的问题。conf文件

  2. # 2 楼答案

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

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

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

    ((会话)实体管理器。getDelegate())。逐出(要逐出的实体)

    这可能不是你特定问题的解决方案,但希望它能帮助别人

  3. # 3 楼答案

    通常,从托管BER(使用JBoss代理包装的注入内容)抛出的每个运行时异常,以及未标记为@ApplicationException(rollback=false)的每个运行时异常,都会导致事务回滚

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

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

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

  4. # 4 楼答案

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

    我们没有找到真正的原因,但很有可能是由于一个长期运行的事务“收获”造成的

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

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

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