SAVEPOINT ステートメント

SAVEPOINT ステートメントを使用して、トランザクション内にセーブポイントを設定します。

呼び出し

このステートメントは、 アプリケーション・プログラム (プロシージャーを含む) に組み込むこともでき、 対話式に発行することもできます。 このステートメントは、動的に作成できる実行可能ステートメントです。

許可

必要ありません。

構文

構文図を読む構文図をスキップするSAVEPOINTsavepoint-nameUNIQUEON ROLLBACK RETAIN CURSORSON ROLLBACK RETAIN LOCKS

説明

savepoint-name
セーブポイントの名前を指定します。 savepoint-name を指定する際に、SYS で始めることはできません (SQLSTATE 42939)。 同じ名前のセーブポイントがこのセーブポイント・レベル内で UNIQUE として既に定義されている場合、 エラーが戻されます (SQLSTATE 3B501)。
UNIQUE
セーブポイントが現行セーブポイント・レベル内でアクティブな間、 このセーブポイントの名前がアプリケーションによって再使用されないことを指定します。 savepoint-name がこのセーブポイント・レベル内に既に存在していると、 エラーが戻されます (SQLSTATE 3B501)。
ON ROLLBACK RETAIN CURSORS
SAVEPOINT ステートメントの後に処理されるオープン・カーソルのステートメントに関して、 このセーブポイントへのロールバックでのシステムの動作を指定します。 この節は可能な限り、セーブポイントへのロールバックによる影響を受けないことを示します。 どのような場合にカーソルがセーブポイントへのロールバックから影響を受けるかについては、 「ROLLBACK」を参照してください。
ON ROLLBACK RETAIN LOCKS
セーブポイントの設定後にかけられるロックに関して、 このセーブポイントへのロールバックでのシステムの動作を指定します。 このセーブポイント以降に獲得したロックは追跡されず、 このセーブポイントへのロールバック時にはロールバック (解放) されません。

規則

  • セーブポイント関連のステートメントをトリガー定義内で使用することはできません (SQLSTATE 42987)。
  • 以下のいずれかのイベントが発生すると、新規のセーブポイント・レベルが開始します。
    • 新規の作業単位 (UOW) が開始する。
    • NEW SAVEPOINT LEVEL 節で定義されたプロシージャーが呼び出される。
    • アトミック・コンパウンド SQL ステートメントが開始する。
  • セーブポイント・レベルの作成の原因となったイベントが終了されるか削除されると、 セーブポイント・レベルは終了します。 セーブポイント・レベルが終了すると、その中に含まれるすべてのセーブポイントは解放されます。 オープン・カーソル、DDL アクション、またはデータ変更すべては その親セーブポイント・レベル (すなわち、今終了したセーブポイント・レベルがその内部で作成された セーブポイント・レベル) によって継承され、親セーブポイント・レベルに対して出された セーブポイント関連のステートメントが適用されます。
  • セーブポイント・レベル内のアクションには、以下の規則が適用されます。
    • セーブポイントは、それが設定されているセーブポイント・レベル内でのみ参照可能です。 現行のセーブポイント・レベルの外で設定されたセーブポイントを解放、破棄、 またはロールバックすることはできません。
    • 現行のセーブポイント・レベル内で設定されているすべてのアクティブなセーブポイントは、 セーブポイント・レベルが終了すると自動的に解放されます。
    • 現行のセーブポイント・レベル内でのみ、セーブポイント名の固有性が強制されます。 他のセーブポイント・レベルでアクティブであるセーブポイントの名前に影響がなければ、 そのセーブポイントの名前を現行のセーブポイント・レベルで再利用できます。

  • SAVEPOINT ステートメントを発行し終えると、 ニックネームに対する挿入、更新、または削除操作は行えなくなります。
  • UNIQUE 節を省略した場合、別のセーブポイントが savepoint-name を 同じセーブポイント・レベル内で再使用してもよいと指定したことになります。 同じ名前のセーブポイントがセーブポイント・レベル内に既に存在しているときには、 既存のセーブポイントが破棄され、新規のセーブポイントがその名前で現在処理中のポイントに作成されます。 この新規のセーブポイントが、 アプリケーションによって最後に設定されたセーブポイントであるとみなされます。 同じ名前の別のセーブポイントを再利用したことによって既存のセーブポイントが破棄されたとしても、 それはそのセーブポイントだけが破棄されたのであり、 破棄されたセーブポイント以降に設定されたセーブポイントが解放されることはないので注意してください。 これら後で設定されたセーブポイントは RELEASE SAVEPOINT ステートメントでのみ解放できます。 このステートメントは、指名されたセーブポイントと、 そのセーブポイント以降に設定されたすべてのセーブポイントを解放します。
  • UNIQUE 節を指定した場合、 savepoint-name は同じ名前の既存のセーブポイントを解放した後でのみ再利用できます。
  • あるセーブポイントにおいて、処理の途中でユーティリティー、SQL ステートメント、 またはデータベース・コマンドが断続的にコミットを実行した場合、そのセーブポイントは暗黙的に解放されます。
  • あるセーブポイントで SET INTEGRITY ステートメントがロールバックされた場合、 動的に準備されたステートメントの名前は依然として有効ですが、 そのステートメントが暗黙的に再び準備されることがあります。
  • 挿入がバッファーに入れられることになっている場合 (すなわち、 アプリケーションが INSERT BUF オプションを指定してプリコンパイルされた場合)、 バッファーは、SAVEPOINT、ROLLBACK、 または RELEASE TO SAVEPOINT ステートメントが出されるとフラッシュされます。

ネストされたセーブポイントに対してロールバック操作を実行します。 まず、DEPARTMENT という名前の表を作成します。 SAVEPOINT1 を開始する前に 1 行挿入し、 SAVEPOINT2 を開始する前にもう 1 行挿入し、 SAVEPOINT3 を開始する前にさらにもう 1 行挿入します。
   CREATE TABLE DEPARTMENT (
     DEPTNO   CHAR(6),
     DEPTNAME VARCHAR(20),
     MGRNO    INTEGER)

     INSERT INTO DEPARTMENT VALUES ('A20', 'MARKETING', 301)

     SAVEPOINT SAVEPOINT1 ON ROLLBACK RETAIN CURSORS

     INSERT INTO DEPARTMENT VALUES ('B30', 'FINANCE', 520)

     SAVEPOINT SAVEPOINT2 ON ROLLBACK RETAIN CURSORS

     INSERT INTO DEPARTMENT VALUES ('C40', 'IT SUPPORT', 430)

     SAVEPOINT SAVEPOINT3 ON ROLLBACK RETAIN CURSORS

     INSERT INTO DEPARTMENT VALUES ('R50', 'RESEARCH', 150)
この時点で、DEPARTMENT 表には A20、B30、C40、および R50 という行があります。 そして、次のステートメントを出すと、
   ROLLBACK TO SAVEPOINT SAVEPOINT3
行 R50 が DEPARTMENT 表からなくなります。 そして、次のステートメントを出すと、
   ROLLBACK TO SAVEPOINT SAVEPOINT1
DEPARTMENT 表は残っていますが、 SAVEPOINT1 を設定した後に挿入した行 (B30 と C40) が表からなくなります。