RELEASE SAVEPOINT — 設定済みのセーブポイントを解放する
RELEASE [ SAVEPOINT ] savepoint_name
RELEASE SAVEPOINT
は指定されたセーブポイントと、指定されたセーブポイントの後に作成されたすべての有効なセーブポイントを解放し、そのリソースを解放します。
セーブポイントの作成後に行われたすべての変更で、まだロールバックされていないものは、指定されたセーブポイントが作成されたときに実行中のトランザクションまたは有効なセーブポイントにマージされます。
RELEASE SAVEPOINT
の後に行われた変更も、この実行中のトランザクションまたは有効なセーブポイントの一部になります。
savepoint_name
解放するセーブポイントの名前です。
設定されていないセーブポイント名を指定するとエラーになります。
トランザクションがアボート状態の時には、セーブポイントを解放することはできません。 そのためには、ROLLBACK TO SAVEPOINTを使用してください。
同じ名前のセーブポイントが複数存在する場合、最後に設定されたセーブポイントのみが解放されます。 コマンドを繰り返すと、より以前のセーブポイントが順次解放されます。
セーブポイントを設定し、その後、解放します。
BEGIN; INSERT INTO table1 VALUES (3); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (4); RELEASE SAVEPOINT my_savepoint; COMMIT;
上記のトランザクションでは、3と4の両方が挿入されます。
複数の入れ子になったサブトランザクションを持つ、より複雑な例。
BEGIN; INSERT INTO table1 VALUES (1); SAVEPOINT sp1; INSERT INTO table1 VALUES (2); SAVEPOINT sp2; INSERT INTO table1 VALUES (3); RELEASE SAVEPOINT sp2; INSERT INTO table1 VALUES (4))); -- エラーになる
この例では、アプリケーションがセーブポイントsp2
の解放を要求し、そこでは3が挿入されています。
これにより、挿入のトランザクションコンテキストがsp1
に変更されます。
値4を挿入しようとする文がエラーになると、同じロールバックされたセーブポイントにあるため、2と4の挿入は失われます。値3は同じトランザクションコンテキストにあります。
他のコマンドはすべて無視されるため、アプリケーションは今や以下の2つのコマンドのうち1つのみを選択できます。
ROLLBACK; ROLLBACK TO SAVEPOINT sp1;
ROLLBACK
を選択すると、値1を含むすべてのコマンドがアボートされますが、ROLLBACK TO SAVEPOINT sp1
を選択すると、値1が保持され、トランザクションの続行が可能になります。
このコマンドは標準SQLに準拠しています。
SQL:2003標準では、SAVEPOINT
は必須であると規定されています。
PostgreSQLではSAVEPOINT
キーワードを省略することができます。