Java
SQL
初心者

トランザクションのセーブポイントについて知る(with Java)

More than 1 year has passed since last update.

この記事でわかること

  • トランザクションのセーブポイントという仕組みの存在。
  • Javaで使用する際のサンプルコード

トランザクションのセーブポイントという仕組みについて

そもそもトランザクションとは、「ある処理を行うための一連の処理の流れ」のことを指します。
一連の処理の中でどれかしらの処理がこけたら、それまでに更新した処理等を巻き戻して処理を行う前の状態に戻すことが多いです。
しかし、状況により、全部は戻したくないがある地点までは戻したいことがあります。
そんな時にSavepointを設定し、その地点まで戻す(ロールバックする)ことが可能です。

Javaで使用する際のサンプルコード

引数のnameをlistテーブルに登録する処理を想定したサンプルコードを記載します。

ポイント

  • Savepointは、Connectionを取得~PreparedStatement取得の間で取得しましょう。
  • Savepointに対応していないDBかチェックしてから、Savepointオブジェクトを取得しましょう。
  • Savepointを取得した地点にrollbackする場合、rollback(save)というようにSavepointオブジェクトを渡しましょう。
  • Savepointに対応していないDBの場合、Savepointオブジェクトはnullのままなので、rollbackする際チェックをいれnullなら普通のrollbackをしましょう。

補足

  • Savepointクラスは、java.sqlパッケージに含まれています。
  • ひとつのConnectionの中で複数のSavepointを持つことが可能です。その場合、各Savepointに名前を付けることが出来ます。(今回のサンプルコードには実装していません)
Java
public void regist(String name) throws SQLException{
    Connection con = null;
    Savepoint save = null;
    String sql = null;
    PreparedStatement ps = null;

    try{
        con = this.getConnection();
        if(con.getMetaData().supportsSavepoints()){
            save = con.setSavepoint();
        }
        sql = "insert into list (name) values (?)";
        ps = con.prepareStatement(sql);
        ps.setString(1, name);
        ps.executeUpdate();
        ps.close()
    }catch(SQLException e){
        if(save != null){
            con.rollback(save);
        }
        else{
            con.rollback();
        }
    }finally{
        if(con!=null){
            try{
                con.close();
            }catch(SQLException e){
            }
        }
    }
}