web-dev-qa-db-ja.com

connection.setAutoCommit = falseで何が起こるか

connection.setAutoCommit(false);を実行すると、データベース側で新しいトランザクションが作成されますか?

5
eatSleepCode

documentation によると、connection.setAutoCommit(false)を使用すると、group複数の後続のStatementsを実行できます。同じトランザクションの下で。このトランザクションは、個々のStatementsに対する各connection.commit()呼び出しの後ではなく、execute()が呼び出されたときにコミットされます(自動コミットが有効になっている場合に発生します)。

connection.setAutoCommit()を使用して自動コミットモードを変更すると、アクティブなトランザクションが暗黙的にコミットされ、新しいトランザクションが作成されます。 Javadocs から:

注:トランザクション中にこのメソッドが呼び出され、自動コミットモードが変更されると、トランザクションがコミットされます。 setAutoCommitが呼び出され、自動コミットモードが変更されていない場合、呼び出しはノーオペレーションです。

8
Mick Mnemonic

JDBC API内の各メソッドの実装は、各ドライバーによって異なります。 Oracleは、MySqlとは非常に異なることを行う可能性があります。

ただし、connection.setAutoCommit(false);を呼び出すだけではトランザクションは作成されません。これは、connection.commit();を呼び出すと、この接続を使用して作成されたステートメントが一緒にコミットされることを意味するだけです。

this Oracleチュートリアルをご覧ください。

2
jfcorugedo

コードで簡単に説明してみましょう。応募したとき

Connection.setAutoCommit(false);

ソースコードでは、自動コミットオプションが無効になります。これは、デフォルトでデータベースで有効になります。

だから、あなたは電話する必要があります

Connection.commit();

データベースへの変更を永続化するためのメソッド。

Class.forName(drivers);
Connection dbConnnection=DriverManager.getConnection(connectionURL,username,password);
dbConnection.setAutoCommit(false); //Disabling the Autocommit
Statement selectStatement = dbConnection.createStatement("Select Query");
ResultSet rs = selectStatement.execute();
while(rs.next()){
    Statement updateStatement = dbConnection.createStatement("update Query");
    //Apply some changes to update record
    statement.execute();
    dbConnection.commit();  //Mandatory to execute to persist changes into database
}
1
Nallamachu

JavaDocsは、このユースケースの優れた説明を トランザクションセクションの使用 で提供します。

自動コミットモードの無効化

接続が作成されると、自動コミットモードになります。これは、個々のSQLステートメントがトランザクションとして扱われ、実行された直後に自動的にコミットされることを意味します。 (より正確には、デフォルトでは、SQLステートメントは実行時ではなく、完了時にコミットされます。ステートメントは、すべての結果セットと更新カウントが取得されたときに完了します。ただし、ほとんどの場合、 、ステートメントは実行された直後に完了し、したがってコミットされます。)

2つ以上のステートメントをトランザクションにグループ化できるようにする方法は、自動コミットモードを無効にすることです。これは、次のコードで示されています。ここで、conはアクティブな接続です。

con.setAutoCommit(false);

1
drgPP