2011-07-03 17 views
4

closeメソッドが呼び出され、アクティブなトランザクションがある場合、アクティブなトランザクションはどうなりますか?彼らはコミットされるかロールバックされるか? Connection.close()のjavadocツールから接続終了時のアクティブなトランザクションの動作?

+1

私は 'JDBC'の特別な経験がないので、これを答えとして提供しませんが、' commit'が送信されずに接続が閉じられている場合は 'rollback'に論理的です。それじゃない? – Nanne

答えて

1

それは、であることを強くアプリケーションが明示的にcloseメソッドを呼び出す前に、アクティブなトランザクションをコミットまたはロールバックすることををお勧めします。 closeメソッドが呼び出され、アクティブなトランザクションがある場合、結果は実装定義です。

3

他の回答に加えて、現在作業しているデータベースであるOracleとSQL Serverの動作をテストしました。

MSSQL ロールバックトランザクション。これはあなたが直感的に期待するものです。

オラクルの反対側では、がコミットをコミットします。 JDBC Guide

自動コミットモードが無効で、明示的にコミットまたはロールバックせずに接続を閉じると、暗黙のCOMMIT操作が実行されます。

確かに、JDBC仕様では自由に自由に行えますが、私は個人的にはトランザクションを暗黙のうちにコミットすることは設計上の選択肢が貧弱だと考えています。引数として、long-ishトランザクションで作業中であり、シャットダウン要求に応答しないスレッドの使用例を考えてみましょう。アプリケーションが最終的に接続プールを閉じると、接続が閉じられ、不完全なトランザクションがコミットされます。

このストーリーの道徳は、接続プールの実装では、手動コミットモードで接続を閉じる前に常にrollback()を呼び出さなければならないということです。しかし、これは接続プールを実装する際に気になるものではありません。例として、参照してくださいPooledConnectionImpl from DBCP

関連する問題