2012-01-19 87 views
2

我得到了下面的Spring框架的錯誤消息:爲什麼我得到一個SpringFramework UnexpectedRollbackException?

Invocation of getLogoForGlobalConext() in class $Proxy44 threw exception 
org.springframework.transaction.UnexpectedRollbackException: 
Transaction rolled back because it has been marked as rollback-only 
at template/includes/macros.vm line 1651, column 43 

我打開macros.vm,擡頭線1651,它看起來像這樣:

#set ($globalLogo = $spaceManager.getLogoForGlobalContext()); 

從我的研究,它看起來像$Proxy44實際上是變量(或者DefaultSpaceManager.java的一個實例)。

此消息隨機出現,當Web應用程序嘗試下載位於Web服務器/數據庫某處的圖像/附件時。

的attachmentmanager由Spring的事務管理管轄,並當圖像/附件被下載使用下列事務屬性:

1)傳播 - 用於在附接管理器的所有方法

2)傳播和只讀 - 對於以「get」開頭的附件管理器中的所有方法。

的屬性定義如下:http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html

我在想什麼是我需要設置交易超時(如將其設置爲無窮大)。

如果您有任何意見或建議,我們將不勝感激。如果您的答案以任何方式提供幫助,我將獎勵積分!

回答

2

事實證明,其中一個getter方法正在執行寫入數據庫。具體而言,它每隔幾分鐘就會更新一次緩存。發生此更新時,引發了UnexpectedRollbackException。由於這個事務應該是上面提到的事務屬性定義的「只讀」,我們不允許在getter操作期間執行更新。

我將getter方法更改爲不對緩存執行任何更新,即使過期也只使用緩存,並且錯誤消失。

希望這可以幫助別人。

相關問題