【问题标题】:Arjuna JTA transaction rollbacked unexpectedlyArjuna JTA 事务意外回滚
【发布时间】:2012-04-13 02:49:15
【问题描述】:

当我检查 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) .我知道一些交易日志已被保留,但这并不能解释如何解决我现在遇到的问题。

【问题讨论】:

  • 我也有同样的问题。谁能告诉怎么解决?

标签: java transactions jboss jms


【解决方案1】:

一般来说,从托管的 be 抛出的每个 RuntimeException(被 JBoss 代理包装的注入的东西)并且未标记为 @ApplicationException(rollback = false) 都会导致事务回滚。

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

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

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

【讨论】:

    【解决方案2】:

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

    我们没有找到真正的原因,但很可能是由于长时间运行的事务被“收获”

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      这导致休眠失败。为了解决这个问题,我们在实体上调用了 evict,这样当我们创建父级的副本时,Hibernate 将停止尝试获取子级。

      ((Session) entityManager.getDelegate()).evict(要驱逐的实体)

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2016-12-27
          • 2013-01-19
          • 2013-06-21
          • 2011-12-10
          • 1970-01-01
          • 1970-01-01
          • 2018-11-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多