DBのトランザクションでセーブポイントを使用したサンプルです。
セーブポイントを使うと、トランザクションの途中まで戻してやり直したりすることができます。 処理の途中で、戻る可能性のある場所でセーブポイントを作成しておいて、いざ戻したくなったら作成したセーブポイントまで戻すという感じでコーディングします。
サンプルソース
例)セーブポイントを使ったデータベースINSERTサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
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①のみコミットされます。