web-dev-qa-db-ja.com

COMMIT OR conn.setAutoCommit(true)

一部のプログラマーがCOMMITを使用して他のプログラマーがconn.setAutoCommit(true);を使用してトランザクションを終了またはロールバックしていることに気づきましたが、一方を他方の代わりに使用する利点は何ですか?

主な違いはどこですか?

conn.setAutoCommit(true);

以上

statement.executeQuery(query);
statement.commit();
10
Motasem

トランザクションの使用からautoCommitの「ステートメントごとのトランザクション」モデルに切り替える場合を除いて、通常はConnection.commit()ではなくConnection.setAutoCommit(true)を使用してトランザクションをコミットする必要があります。

とはいえ、トランザクション中にConnection.setAutoCommit(true)を呼び出すと、トランザクションがコミットされます(ドライバーがJDBC 4.1仕様のセクション10.1.1に準拠している場合)。ただし、接続でautoCommitを有効/無効にすると、単にコミットするよりも接続のオーバーヘッドが高くなる可能性があるため、その後autoCommitを維持する場合にのみ、実際にこれを行う必要があります(たとえば、トランザクションマネージャーを切り替える必要があるため、追加のチェックを行う、など)。

また、Connection.commit()を使用し、ネイティブSQLコマンドCOMMITは使用しないでください。接続のドキュメントに詳述されているように:

注:接続を構成する場合、JDBCアプリケーションはsetAutoCommitやsetTransactionIsolationなどの適切な接続メソッドを使用する必要があります。 JDBCメソッドが使用可能な場合、アプリケーションはSQLコマンドを直接呼び出して接続の構成を変更しないでください。

重要なのは、commit()setAutoCommit(boolean)のようなコマンドは、ResultSetsを閉じたりStatementsを閉じたりリセットしたりするなど、バックグラウンドでより多くの作業を行う可能性があるということです。 SQLコマンドCOMMITを使用すると、これがバイパスされ、ドライバー/接続が誤った状態になる可能性があります。

11
Mark Rotteveel

conn.setAutoCommit();の使用法は接続に適用され、単一のトランザクションでXクエリを実行するか、executeごとに1つのトランザクションを使用する可能性があります。

APIが説明するように:

 void setAutoCommit(boolean autoCommit)
                    throws SQLException

この接続の自動コミットモードを指定された状態に設定します。接続が自動コミットモードの場合、そのすべてのSQLステートメントが実行され、個別のトランザクションとしてコミットされます。それ以外の場合、そのSQLステートメントは、メソッドcommitまたはメソッドロールバックのいずれかの呼び出しによって終了するトランザクションにグループ化されます。デフォルトでは、新しい接続は自動コミットモードです

単純なケースの場合:

conn.setAutoCommit(false); 
statement.executeQuery(query); 
statement.commit();

と同じになります:

conn.setAutoCommit(true); 
statement.executeQuery(query);
4
MrJames