質問

Java Connection.closeはfinallyブロックにロールバックしますか?

.Net SqlConnection.closeがそれを行うことを知っています。

これにより、キャッチせずにtry / finallyブロックを作成できます...

例:

try {
    conn.setAutoCommit(false);
    ResultSet rs = executeQuery(conn, ...);
    ....
    executeNonQuery(conn, ...);
    ....

    conn.commit();
} finally {
   conn.close();
}
役に立ちましたか?

解決

javadoc 、closeメソッドを呼び出す前に、コミットまたはロールバックを試みる必要があります。それ以外の場合、結果は実装定義です。

他のヒント

私が使用したデータベースシステムでは、コミットの直後にロールバックを実行しても問題はありません。早期復帰によりコミットが失われ、ロールバックによりトランザクションがロールバックされます。安全なことは

try {
    conn.setAutoCommit(false);
    ResultSet rs = executeQuery(conn, ...);
    ....
    executeNonQuery(conn, ...);
    ....

    conn.commit();
} finally {
   conn.rollback();
   conn.close();
}

OracleのJDBCドライバーは、デフォルトでclose()でコミットします。マルチプラットフォームJDBCコードを作成する場合、この動作に依存しないでください。

データベースによって動作は完全に異なります。例:

Oracle

トランザクションは、開いているトランザクションとの接続を閉じるときにコミットされます(@Mr。Shiny and New安宇のように。

SQLサーバー

  

トランザクションの途中でcloseメソッドを呼び出すと、   ロールバックされるトランザクション。

closeメソッド(SQLServerConnection)

finallyブロックでロールバックしても意味がありません。コミットしてコミットが成功した後、なぜロールバックするのですか?もし私があなただったら、catch blockでロールバックします。

MySQL JDBCの場合、コミットまたはロールバックメソッドを呼び出さずに閉じられた場合、実装は接続をロールバックします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top