トランザクション処理

 トランザクションは、データベースに対する複数の更新を一つの処理として扱う単位です。もし複数の更新処理のうち、一つでも失敗したら更新前の状態に戻し、すべての更新処理が成功したら確定することができます。

 Javaプログラムからデータベースを操作するときに、既定の設定では自動的確定するようになっているので、トランザクション処理をする場合はその機能をオフにする必要があります。その後、データベースに対する処理を行ない、成功したらコミット(確定)、失敗したらロールバック(取り消し)の指定をします。

 トランザクション処理を行うにはConnectionクラスとCommandクラスを使います。トランザクション処理は次の手順で行います。

1. データベースに接続する
2. ConnectionオブジェクトのsetAutoCommitメソッドで自動コミット機能をオフにする
3. SQLコマンドを実行する
4. 確定(Commit)するか、取り消し(Rollback)をする
5. データベースを切断する

○ プロジェクト

 プロジェクトを作成して確認してみましょう。

プロジェクト名 TransactionTest

サンプルダウンロード

○ 作成の準備

 StatementTestプロジェクトをコピーして作成してください。

○ プログラム

 mainメソッドを次のように記述してください。

  1. public static void main(String[] args) {
  2.  try{
  3.   //JDBCドライバークラスを指定する
  4.   String drivername = "com.mysql.jdbc.Driver";
  5.   //データベースを指定する
  6.   String url = "jdbc:mysql://localhost:3306/books?characterEncoding=utf8";
  7.   //ユーザー名を指定する
  8.   String username = "root";
  9.   //パスワードを指定する
  10.   String password = "";
  11.   //指定したドライバークラスを読み込む
  12.   Class.forName(drivername);
  13.   //データベースに接続する
  14.   Connection con = DriverManager.getConnection(url, username, password);
  15.   //自動コミットをオフにする
  16.   con.setAutoCommit(false);
  17.   //追加する情報を入力する
  18.   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  19.   System.out.println("登録するユーザー情報を入力してください。");
  20.   System.out.print("ID:");
  21.   int id = Integer.parseInt(br.readLine());
  22.   System.out.print("ユーザー名:");
  23.   String uname = br.readLine();
  24.   System.out.print("パスワード:");
  25.   String passwd = br.readLine();
  26.   System.out.print("氏名:");
  27.   String name = br.readLine();
  28.   //入力した情報をもとにSQL文を作成する
  29.   String sql = "INSERT INTO Users VALUES(" + id + ", '" + uname + "', '" + passwd + "', '" + name + "')";
  30.   //Statementオブジェクトを取得する
  31.   Statement st = con.createStatement();
  32.   //SQL文を実行する
  33.   int ret = st.executeUpdate(sql);
  34.   //変更のあった行数を表示する
  35.   System.out.println("変更のあった件数:" + ret);
  36.   //確定か取り消しを入力
  37.   System.out.print("1)確定 2)取り消し(デフォルト):");
  38.   String input = br.readLine();
  39.   switch(input){
  40.   case "1":
  41.    //確定
  42.    con.commit();
  43.    System.out.println("確定しました。");
  44.    break;
  45.   default:
  46.    con.rollback();
  47.    System.out.println("取り消しました。");
  48.    break;
  49.   }
  50.   //データベースを切断する
  51.   con.close();
  52.  }catch(Exception e){
  53.   //例外の状態を出力する
  54.   e.printStackTrace();
  55.  }
  56. }

○ 実行結果

登録するユーザー情報を入力してください。 ID:5
ユーザー名:itou
パスワード:ipass
氏名:伊藤
変更のあった件数:1
1)確定 2)取消し(デフォルト):2
取り消しました。

Usersテーブルに追加されていない
Usersテーブルに追加されていない

登録するユーザー情報を入力してください。 ID:5
ユーザー名:itou
パスワード:ipass
氏名:伊藤
変更のあった件数:1
1)確定 2)取消し(デフォルト):1
確定しました。

Usersテーブルに追加された
Usersテーブルに追加された

○ 解説

 30行目で自動コミット機能をオフにしています。これにより、SQL文を実行するとトランザクションモードで実行され、すぐには確定されなくなります。

 60行目から、確定するか、取り消すかの処理が行われます。もし確定する場合は63行目にあるように、Connectionオブジェクトのcommitメソッドを呼び出して確定します。これによりデータベース上の変更が確定され、データベースに反映されます。取り消す場合は67行目にあるようにConnectionオブジェクトのrollbackメソッドを呼び出して取り消します。これによりデータベース上の変更が破棄され、SQL文実行前の状態に戻ります。確定か、取り消しかを指定した後、73行目にあるようにデータベースを閉じます。

前へ   次へ