search
LoginSignup
2

More than 1 year has passed since last update.

posted at

updated at

Java-トランザクション制御

トランザクション

トランザクションとは、一連の処理を一つのまとまった処理として扱うための論理的な単位です。同一トランザクションに属するSQL処理が複数ある場合

  • すべてが成功して初めて処理結果を確定する(コミット)
  • 途中で失敗したら、トランザクション実行前の状態に戻す(ロールバック)

データベースの処理結果を確定させることをコミット(commit)、実行前の状態に戻すことをロールバック(rollback)といいます。

トランザクションの利用

Javaでは、JBDC(Java DataBase Connectivity)というデータベース操作専用のAPIが提供されています。
JBDCを用いてトランザクション制御を指示するには、Connectionオブジェクトを使います。

1. setAutoCommit()-接続が確立した直後

JBDCのデフォルトでは、SQLが一つ送信されるたびに自動的にコミットされるオートコミットモードになっています。以下の宣言を行うことで明示的にトランザクション制御をできます。

  • con.setAutoCommit(false); : 自動コミットモードの解除

そして、以下の宣言を行うことで自動的にコミットさレルオートコミットモードに戻すことができます。

  • con.setAutoCommit(true); : 自動コミットモードの設定

2. commit-一連のSQLを全て送信し終わったとき

一連ののトランザクションに必要なSQL文を全て送信したら、commitを呼び出してコミットします。

  • com.commit(); : 送信済みの処理要求の確定(コミット)

この呼び出しにより、前回のcommit()以降に送信された全てのSQL要求が一つのトランザクションとみなされ、実行結果が確定される。

3.rollback()-途中で異常を検知したとき

複数のSQL要求を送信している途中で異常を検知したらり、何らかの理由で処理をキャンセルしたい場合、rollback()を使います。

  • con.rollack(); : 送信済みの処理要求をキャンセル(ロールバック)

この呼び出しにより、commit()以降に送信されたすべてのSQl要求が全てロールバックされます。また、プログラム中で明示的にrollbackを呼び出さなくても、データベースの接続が途中で切断された場合やJavaプログラムまたはデータベースの強制終了によって最終的にcommit()が発行されない場合、データベースは自動的にロールバックを行います。

サンプルコード

import java.sql.*;


public class Main {
    public static void main(String[] args) {

        try {
            // JDBCドライバーの有効化
            Class.forName("org.h2.Driver");
        } catch(ClassNotFoundException e) {
            e.printStackTrace();
        }

        Connection con = null;
        try {
            // データベースの接続
            con = DriverManager.getConnection("jdbc:j2:~/rpgdb");  // JDBC URLを指定
            // オートコミット解除
            con.setAutoCommit(false);

            /** SQL発行処理(省略) */

            // トランザクションのコミット
            con.commit();
            // SQLExceptionが発生した場合の処理
        } catch(SQLException e) {
            try {
                // トランザクションのロールバック
                con.rollback();
            } catch (SQLException e2) {
                // スタックトレースを出力
                e2.printStackTrace();
            }
        } finally {
            if(con != null) {
                try {
                    // オートコミット有効化
                    con.setAutoCommit(true);
                    // データベース接続の切断
                    con.close();
                } catch(SQLException e3) {
                    // スタックトレースを出力
                    e3.printStackTrace();
                }
            }
        }
    }
}



Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2