2014-03-01 42 views
1

我正在研究一個廣泛使用春季交易的項目。我碰巧發現我正在拋出一個異常,而沒有正確處理它沒有提交或回滾事務的離子。所以即使線程停止,連接仍然保持活動狀態。當向web服務器(Apache tomcat 7.0)發出新的請求時,Spring提供了與新線程的較早連接。由於線程沒有啓動連接,因此線程無法關閉它,也就是說,.commit不起作用。因爲即使在沒有異常的情況下,對象在後續事務中也不會持久保存在數據庫中。我該如何解決這個問題,以便我可以檢測到實際問題發生在哪裏,或者可以設計一個退出點,我可以在響應發送到瀏覽器之前明確地關閉事務。Spring是否真的爲每個線程提供新的事務?

+0

您的診斷可能是錯誤的。無論您如何處理異常,Spring都會爲您提交或回滾事務:如果從事務性方法拋出運行時異常,則事務將回滾。否則,它承諾。但是,您有責任始終關閉JDBC連接。如果你使用Spring的JdbcTemplate,Spring也會爲你做。 –

+0

也許你從來沒有使用Spring的Programatic Transaction Approah。如果你看看Spring代碼的相同,我們可以看到事務是基於線程的,其中TransactionStatus對象被綁定到每個帶有isOwner作爲布爾標誌的函數,從而賦予函數最終提交決策的權力。 –

+0

如果我們不在owner函數中編寫任何.Commit或.rollback,那麼TransactionStatus的對象引用會丟失,當從線程池返回相同的線程時,新的事務永遠不會啓動,並且它會在先前的事務中被包裝,最終u永遠不會進行轉換,並且在一段時間不活動後我們會關閉連接。 –

回答

0

默認情況下,從@Transactional方法拋出的運行時未檢查異常或錯誤將回滾該事務;默認情況下,返回或檢查異常將提交事務。您可以告訴Spring使用@Transactional註釋的註釋類型元素來覆蓋該行爲。

Spring框架參考手冊有一個entire chapter devoted to transaction management。你需要閱讀並理解這一點作爲你的出發點。

+1

A * runtime *異常回滾事務。檢查的異常不會。 –

+0

澄清了答案。 –

相關問題