17

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

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

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

例:

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

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

6 に答える 6

28

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

于 2008-10-20T13:49:35.900 に答える
10

私が使用したデータベース システムでは、コミットの直後にロールバックを実行しても害はありません。そのため、try ブロックでコミットし、finally ブロックでロールバックすると、コミットされますが、例外または早期復帰が原因である場合コミットが見逃されると、ロールバックはトランザクションをロールバックします。ですから、安全な方法は

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

    conn.commit();
} finally {
   conn.rollback();
   conn.close();
}
于 2008-10-21T19:23:05.493 に答える
6

動作は、異なるデータベース間で完全に異なります。例:

オラクル

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

SQLサーバー

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

close メソッド (SQLServerConnection)

于 2013-02-28T12:15:13.997 に答える
6

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

于 2008-10-20T14:29:52.403 に答える
0

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

于 2014-08-02T00:45:06.137 に答える
-1

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

于 2013-02-08T16:49:28.710 に答える