HOME > セーブポイントを使ったサンプル

セーブポイントを使ったサンプル

セーブポイントのイメージ

セーブポイントを使うと、トランザクションの途中まで戻してやり直したりすることができます。

処理の途中で、戻る可能性のある場所でセーブポイントを作成しておいて、いざ戻したくなったら作成したセーブポイントまで戻すという感じでコーディングします。

※注意点として、オートコミットは必ずオフにしておく必要があります。


サンプルソース

セーブポイントを使ったデータベースINSERTサンプル
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Savepoint;

public class DBSample {

    public static void main(String[] args) throws Exception{

        //変数定義
        Connection conn = null;
        PreparedStatement ps = null;

        //DB接続情報を設定する
        String path = "jdbc:oracle:thin:@127.0.0.1:1521:testdb";  //接続パス
        String id = "user01";    //ログインID
        String pw = "password";  //ログインパスワード

        //SQL文を定義する
        String sql = "INSERT INTO test_table values(?)";

        try {
            //JDBCドライバをロードする
            Class.forName("oracle.jdbc.driver.OracleDriver");

            //DBへのコネクションを作成する
            conn = DriverManager.getConnection(path, id, pw);
            conn.setAutoCommit(false);  //オートコミットをオフにするのを忘れずに

            //INSERT①実行
            ps = conn.prepareStatement(sql);
            ps.setString(1, "111");
            ps.executeUpdate();

            //セーブポイント①作成
            Savepoint sp1 =  conn.setSavepoint();

            //INSERT②実行
            ps.setString(1, "222");
            ps.executeUpdate();

            //セーブポイント②作成
            Savepoint sp2 = conn.setSavepoint();

            //INSERT③実行
            ps.setString(1, "333");
            ps.executeUpdate();

            //セーブポイント①まで戻す
            conn.rollback(sp1);

            //コミット
            conn.commit();

            System.out.println("完了しました。");

        } catch (Exception ex) {
            //例外発生時の処理
            conn.rollback();       //ロールバックする
            ex.printStackTrace();  //エラー内容をコンソールに出力する

        } finally {
            //クローズ処理
            if (ps != null) ps.close();
            if (conn != null) conn.close();
        }

    }
}

実行結果
C:\>java DBSample 完了しました

事前にオラクルのJDBCドライバを用意しておく必要があります。
(ここの例では「ojdbc14.jar」)


結果として、INSERT②とINSERT③はロールバックされるので、
INSERT①のみコミットされます。