簡體   English   中英

連接關閉時活動事務的行為?

[英]Behaviour of active transaction on connection close?

如果調用了 close 方法並且有一個活動事務,那么活動事務會發生什么? 他們會被提交還是回滾?

添加到另一個答案中,我測試了 Oracle 和 SQL 服務器上的行為,這是我目前正在使用的數據庫。

MSSQL回滾事務。 這是您直觀地期望的。

另一邊的 Oracle提交事務。 這記錄在他們的JDBC 指南中:

如果自動提交模式被禁用並且您關閉連接而沒有顯式提交或回滾您的最后更改,則運行隱式 COMMIT 操作。

當然,JDBC 規范讓您可以自由選擇 go,但我個人認為隱式提交事務是一個糟糕的設計選擇。 作為一個論點,考慮一個線程的用例,它忙於處理一個長事務並且沒有響應關閉請求。 當應用程序最終關閉連接池時,這將反過來關閉連接,提交不完整的事務!

這個故事的寓意是,連接池實現必須始終在手動提交模式下關閉連接之前調用 rollback()。 然而,這並不是在實現連接池時才想到的。 例如,請參閱DBCP 中的 PooledConnectionImpl

Connection.close()的javadoc:

強烈建議應用程序在調用 close 方法之前顯式提交或回滾活動事務。 如果調用 close 方法並且存在活動事務,則結果是實現定義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM