2012-03-29 104 views
9

當我檢查JBoss的日誌,我看到很多這些錯誤的阿朱JTA事務意外rollbacked

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) 。我知道一些交易記錄已被保留,但這並不能解釋如何解決我現在遇到的問題。

+0

我有同樣的問題。任何人都可以告訴如何解決它? – Eldar 2012-09-19 03:03:14

+0

我有同樣的問題! – Nurlan 2012-09-19 03:07:58

回答

1

我已經在JBoss 5.1(至少第二個是指超時)看到了類似的錯誤

我們沒有找到實際的原因,但很可能,它是造成因長期運行的事務「獲得收益」

我們得出這個結論的原因是我們在高負荷時發現了這種情況,有些操作需要很長時間才能完成。

我們使用PostgreSQL,並且有很多連接「在交易中等待」,在收割後被清除。檢查配置中的事務超時並將其設置爲較高的值以查看是否緩解問題。

https://community.jboss.org/wiki/TransactionTimeout涵蓋了如何管理此設置。

1

一般來說,從託管引發的每個RuntimeException(用JBoss代理包裝的注入內容)並且未標記爲@ApplicationException(rollback = false)將導致事務回滾。

這些情況通常很容易在日誌文件中看到。

另一方面,超時有點棘手。你會在日誌文件中看到類似如下的內容:「中止操作ID -3f57fd2d:e48e:4cf8de0f:bc在其中多個線程處於活動狀態時調用。」

其他調用將繼續運行,並且僅當它們嘗試訪問數據庫連接時接收到「事務標記爲回滾」異常時纔會失敗。

1

我們收到類似的錯誤,後來發現原因與我們如何創建和處理我們的實體有關。我們有一個包含子實體列表的父對象,我們正在創建父母的副本,然後嘗試將新的子孩添加到列表中。這個問題雖然是那些孩子名單被打上了延遲加載註釋:

@OneToMany(級聯= CascadeType.ALL,取= FetchType.LAZY ...

這是導致休眠失敗要解決但我們不得不呼籲逐出的實體,這樣的Hibernate會停止努力,每當我們創建父的副本來獲取孩子。

((會話)entityManager.getDelegate())。逐出(實體驅逐)

這可能不是解決您的特定問題的方法,但希望它可以幫助某人!

-2

我們解決了在postgresql.conf文件中增加max_prepared_transactions爲100的問題。