我正在研究一個廣泛使用春季交易的項目。我碰巧發現我正在拋出一個異常,而沒有正確處理它沒有提交或回滾事務的離子。所以即使線程停止,連接仍然保持活動狀態。當向web服務器(Apache tomcat 7.0)發出新的請求時,Spring提供了與新線程的較早連接。由於線程沒有啓動連接,因此線程無法關閉它,也就是說,.commit不起作用。因爲即使在沒有異常的情況下,對象在後續事務中也不會持久保存在數據庫中。我該如何解決這個問題,以便我可以檢測到實際問題發生在哪裏,或者可以設計一個退出點,我可以在響應發送到瀏覽器之前明確地關閉事務。Spring是否真的爲每個線程提供新的事務?
1
A
回答
0
默認情況下,從@Transactional
方法拋出的運行時未檢查異常或錯誤將回滾該事務;默認情況下,返回或檢查異常將提交事務。您可以告訴Spring使用@Transactional
註釋的註釋類型元素來覆蓋該行爲。
Spring框架參考手冊有一個entire chapter devoted to transaction management。你需要閱讀並理解這一點作爲你的出發點。
+1
A * runtime *異常回滾事務。檢查的異常不會。 –
+0
澄清了答案。 –
相關問題
- 1. BackgroundWorker是否提供真正的多線程?
- 2. 是否有一個ExecutorService爲每個任務創建一個新的線程?
- 3. Spring Data Neo4j InvalidDataAccessApiUsageException:此線程的事務不是最新的
- 4. python中的線程模塊是否提供了真正的並行性?
- 5. 同一個事務中的多個資源提供者Spring
- 6. 應用服務器是否提供了Spring可以提供的功能
- 7. jmx是否爲每個調用創建一個新線程?
- 8. Spring事務管理器是否將連接綁定到線程?
- 9. 開始新的事務是否強制當前事務提交?
- 10. Cloo中是否提供仿真模式?
- 11. DotNetOpenAuth OpenId提供程序是否真的有效?
- 12. PyZMQ是否爲每個新客戶端連接創建線程?
- 13. Spring的事務處理線程
- 14. performSelectorInBackground是否爲每次調用產生新的線程?
- 15. 我真的需要爲URLLoader提供一個事件處理程序嗎?
- 16. 使用StoredProcedure類型的SqlCommand是否提供外部事務?
- 17. Sendgrid是否爲每個電子郵件提供響應?
- 18. Spring的PlatformTransactionManager是否需要按特定順序提交事務?
- 19. 描述每個ZF2路線 - 是否真的需要?
- 20. 多線程服務器/每個線程上的新對象
- 21. Spring + Hibernate - 當事務真的被提交時?
- 22. 爲DDD中的每個服務類提供一個接口是否是一種很好的設計實踐?
- 23. 是否爲[email protected]提供了一個新的應用程序權限?
- 24. Java - 在單獨的線程中爲每個客戶端提供服務的服務器?
- 25. 爲記事本++中的每個單詞提供單引號?
- 26. 哪個Spring Framework提供REST服務?
- 27. 每個RMI請求是否在服務器端創建一個新線程?
- 28. 我是否需要爲每個線程創建新的Callable對象?
- 29. Spring提供CGLIB錯誤的事務註釋
- 30. iPhone是否提供了一個很好的加密API /服務提供者?
您的診斷可能是錯誤的。無論您如何處理異常,Spring都會爲您提交或回滾事務:如果從事務性方法拋出運行時異常,則事務將回滾。否則,它承諾。但是,您有責任始終關閉JDBC連接。如果你使用Spring的JdbcTemplate,Spring也會爲你做。 –
也許你從來沒有使用Spring的Programatic Transaction Approah。如果你看看Spring代碼的相同,我們可以看到事務是基於線程的,其中TransactionStatus對象被綁定到每個帶有isOwner作爲布爾標誌的函數,從而賦予函數最終提交決策的權力。 –
如果我們不在owner函數中編寫任何.Commit或.rollback,那麼TransactionStatus的對象引用會丟失,當從線程池返回相同的線程時,新的事務永遠不會啓動,並且它會在先前的事務中被包裝,最終u永遠不會進行轉換,並且在一段時間不活動後我們會關閉連接。 –