2017-07-19 132 views
1

在我的grails應用程序中,我經常得到org.springframework.transaction.HeuristicCompletionException:啓發式完成:結果狀態回滾;嵌套異常是org.springframework.transaction.UnexpectedRollbackException:事務已回滾,因爲它已標記爲只回滾。我以某種方式發現,如果在由@Transactional註釋的方法內發生任何類型的異常,並在具有其自己的@Transactional的方法內部調用,則會發生這種情況。我的查詢是否可以簡單地捕獲並忽略此異常?Grails中的HeuristicCompletionException可以忽略嗎?

+0

這是什麼意思是事務回滾沒有從你身邊做。 –

+0

我隨機得到這個問題,任何暫時的問題都可能導致事務回滾,這不是我主要關心的問題。這將在下次登錄時修復,但我不希望此異常觸發異常時生成的電子郵件。 –

+0

發生什麼事是,您的嵌套方法調用之一引發未經檢查的異常,這是導致事務被標記爲僅回滾。然後在哪裏調用你的代碼捕獲異常。但事務已標記爲僅回滾,並且您看到此UnexpectedRollbackException錯誤。您可以確保,未經檢查的異常不會跨越事務性方法,並在此之前捕獲它。否則,或者讓原始異常一直傳播起來..否則只是忽略這個UnexpectedRollbackException –

回答

1

對此我有一個解決方法,正如Sudhir在評論中所建議的,我可以在其中一個方法中複製啓發式完成問題,並發現爲了不回滾服務使用的現有事務,我們爲每個方法創建新的事務爲:

@Transactional 
Class MyService { 
@Transactional(propagation = PROPAGATION.REQUIRES_NEW) 
def myMethod(){ 
throw new Exception(); 
} 
} 

註釋@Transactional(傳播= PROPAGATION.REQUIRES_NEW)這將創建一個新的事務處理的方法和暫停現有的事務。由於這會在每次執行方法時創建新的事務,這肯定會對大型多線程應用程序造成性能問題,所以我通過處理服務類中每個方法中的所有可能的異常來緩解這種情況。這會更好。

相關問題