JDBCのセーブポイント(Savepoint)とは?トランザクション制御の基本と使い方を解説
JDBCのセーブポイント(Savepoint)とは
セーブポイント(Savepoint)は、トランザクションに対してよりきめ細かい制御を可能にする機能です。OracleのPL/SQLをはじめ、多くの最新のDBMSが、それぞれの環境でセーブポイントをサポートしています。
セーブポイントを設定すると、トランザクションの中に論理的なロールバック地点を定義できます。セーブポイントより後の処理でエラーが発生した場合でも、rollbackメソッドを使えば「トランザクション全体の変更」を取り消すことも、「セーブポイント以降の変更だけ」を取り消すことも可能です。これにより、正常に完了した前半の処理を保ちながら、問題のあった部分だけをやり直すことができます。
セーブポイントを管理する主なメソッド
Connectionオブジェクトには、セーブポイントを管理するためのメソッドが用意されています。
- setSavepoint(String savepointName): 新しいセーブポイントを定義します。戻り値としてSavepointオブジェクトを返します。
- releaseSavepoint(Savepoint savepointName): 指定したセーブポイントを削除します。引数にはSavepointオブジェクトが必要で、通常は
setSavepoint()メソッドが生成したオブジェクトを渡します。 - rollback(String savepointName): 指定したセーブポイントまで処理をロールバックします。
使用例
次のコードは、INSERT文の実行中にエラーが発生した場合、セーブポイントまでロールバックする例です。
try {
// 有効な接続オブジェクト conn を前提とする
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
// セーブポイントを設定
Savepoint savepoint1 = conn.setSavepoint("Savepoint1");
// 正常なSQL文を実行
String sql1 = "INSERT INTO Employees " + "VALUES (106, 20, 'Rita', 'Tez')";
stmt.executeUpdate(sql1);
// 構文エラーのある不正なSQL文を実行して例外を発生させる
String sql2 = "INSERTED IN Employees " + "VALUES (107, 22, 'Sita', 'Tez')";
stmt.executeUpdate(sql2);
// エラーがなければ変更をコミット
conn.commit();
} catch(SQLException se) {
// エラー発生時はセーブポイントまでロールバック
conn.rollback(savepoint1);
}
利用時の注意点
- セーブポイントを使用する前に、必ず
conn.setAutoCommit(false)で自動コミットを無効化してください。自動コミットモードでは各SQL文が即座に確定されるため、セーブポイントによる部分ロールバックが機能しません。 - セーブポイントまでロールバックした後もトランザクションは継続状態にあるため、その後に
commit()またはrollback()を呼び出してトランザクションを明示的に完了させる必要があります。 - 不要になったセーブポイントは
releaseSavepoint()で解放すると、リソースを効率的に管理できます。
-
C#のインデクサーとは?基本構文と実装例をわかりやすく解説
インデクサーとはC#のインデクサー(indexer)は、クラスのオブジェクトに対して、配列と同じように「[ ]」を使ってインデックスでアクセスできるようにする機能です。これにより、内部に持つデータのコレクションへ、直感的かつ安全に読み書きを行うことができます。インデクサーの基本的な構文は次のとおりです。基本構文element-type this[int index] { // get アクセサー:index で指定された値を返す get { } // set アクセサー:index で指定された位置に値を設定する set { } }インデクサーは
-
C#の名前空間(namespace)とは?定義方法と基本的な使い方を解説
名前空間とは名前空間(namespace)とは、ある一連の名前を別の一連の名前から分離して管理するための仕組みです。大規模なプロジェクトでは、複数の開発者が同じ名前のクラスやメソッドを作成することがあり、名前の衝突(コンフリクト)が発生する可能性があります。名前空間を使うことで、こうした衝突を防ぎ、コードを論理的に整理できます。また、.NET Framework が提供する System なども名前空間の一つであり、標準ライブラリの機能はすべて名前空間によって分類・管理されています。名前空間の定義方法名前空間の定義は、namespace キーワードで始まり、その後に名前空間名を続けて記述します