MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

JDBCのsetAutoCommit()メソッドとは?使い方とトランザクション制御の基本

データベースのコミットとは

データベースに対してコミット(commit)を行うと、その時点までに実行されたすべての変更が確定・保存されます。Javaでは、commit()メソッドを使ってコミットを実行できます。

一方、処理中に何らかの問題が発生した場合は、rollback()メソッドを使うことで、最後にコミットした時点までデータベースの状態を巻き戻すことができます。

多くのデータベースでは、デフォルトでSQL文の実行ごとに自動的にコミットが行われる「自動コミットモード」が有効になっています。しかし、トランザクションを管理する場合には、複数の処理をひとまとめにして手動でコミットする必要があります。

setAutoCommit()メソッドの役割

このような場面で活躍するのがsetAutoCommit()メソッドです。このメソッドはConnectionインターフェースに属しており、引数としてboolean型の値を1つ受け取ります。

  • true を渡す → 自動コミット機能が有効になる
  • false を渡す → 自動コミット機能が無効になり、手動でコミットする必要がある

自動コミットを無効にするには、次のように記述します。

Con.setAutoCommit(false);

使用例:バッチ処理と組み合わせたトランザクション制御

以下のプログラムは、バッチ処理を使ってテーブルにデータを挿入する例です。ここでは、まず自動コミットを無効化し、必要なINSERT文をバッチに追加して一括実行した後、明示的にコミットすることで変更を保存しています。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class BatchProcessing_Statement {
    public static void main(String args[])throws Exception {
        // 接続の取得
        String mysqlUrl = "jdbc:mysql://localhost/sampleDB";
        Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
        System.out.println("Connection established......");
        // CREATE TABLE Dispatches( Product_Name VARCHAR(255), Name_Of_Customer
        // VARCHAR(255), Month_Of_Dispatch VARCHAR(255), Price INT, Location VARCHAR(255));
        // Statementオブジェクトの作成
        Statement stmt = con.createStatement();
        // 自動コミットを無効に設定
        con.setAutoCommit(false);
        // レコード挿入用のSQL文
        String insert1 = "INSERT INTO Dispatches( Product_Name , Name_Of_Customer , "
            + "Month_Of_Dispatch , Price, Location) VALUES "
            + "('KeyBoard', 'Amith', 'January', 1000, 'hyderabad')";

        String insert2 = "INSERT INTO Dispatches( Product_Name , Name_Of_Customer , "
            + "Month_Of_Dispatch , Price, Location) VALUES "
            + "('Earphones', 'SUMITH', 'March', 500, 'Vishakhapatnam')";

        String insert3 = "INSERT INTO Dispatches( Product_Name , Name_Of_Customer , "
            + "Month_Of_Dispatch , Price, Location) VALUES "
            + "('Mouse', 'Sudha', 'September', 200, 'Vijayawada')";
        // SQL文をバッチに追加
        stmt.addBatch(insert1);
        stmt.addBatch(insert2);
        stmt.addBatch(insert3);
        // バッチを実行
        stmt.executeBatch();
        // 変更を保存(コミット)
        con.commit();
        System.out.println("Records inserted......");
    }
}

実行結果

Connection established......
Records inserted......

まとめ

setAutoCommit(false)を呼び出して自動コミットをオフにすることで、複数のSQL文をひとつのトランザクションとして扱えます。すべての処理が成功した後にcommit()を呼べば変更が確定され、途中でエラーが発生した場合にはrollback()を呼び出すことで、データベースの一貫性を保ったまま安全に処理を取り消せます。バッチ処理など、大量のデータを扱う場面では特に重要なテクニックです。

  1. JavaのsetBounds()メソッドとは?使い方とサンプルコードを解説

    JavaのGUIプログラミングでは、レイアウトマネージャー(Layout Manager)がコンポーネントの位置やサイズを自動的に決定します。しかし、レイアウトマネージャーを使用しない場合は、コンポーネントの位置とサイズを手動で設定する必要があります。そのような場面で活躍するのがsetBounds()メソッドです。フレームのレイアウトマネージャーをnullに設定することで、コンポーネントの位置とサイズを自由に指定できるようになります。setBounds()メソッドの基本setBounds()メソッドは4つの引数を取ります。第1引数と第2引数はコンポーネントの左上隅のx座標・y座標、第3引数はコ

  2. Python×MySQLのrollback()メソッドとは?トランザクションの取り消し方法を解説

    Pythonには、データベースのトランザクションを制御するためのさまざまなメソッドが用意されています。その中でも本記事で取り上げるのがrollback()メソッドです。 rollback()メソッドとは rollback()メソッドは、データベースに対して行った直近の変更やコミットを取り消し(ロールバック)するために使用されます。たとえば、ユーザーがデータベースへの変更に満足できなかった場合や、トランザクションが何らかの理由で失敗した場合に、このメソッドを実行することで、変更を加える前の元の状態へデータベースを復元できます。 トランザクションが失敗した際にデータの整合性を保つために非常に重要な