ROLLBACK TO SAVEPOINT — セーブポイントまでロールバックする
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name
セーブポイントの設定後に実行されたコマンドを全てロールバックします。 セーブポイントは有効なまま残るので、必要に応じて、その後再度ロールバックすることができます。
ROLLBACK TO SAVEPOINTは、指定したセーブポイントより後に設定した全てのセーブポイントを暗黙的に破棄します。
savepoint_nameロールバック先のセーブポイントです。
セーブポイントの設定後に実行されたコマンドの結果を維持したままセーブポイントを破棄するには、RELEASE SAVEPOINTを使用してください。
設定されていないセーブポイントの名前を指定するとエラーになります。
カーソルはセーブポイントという観点から見るとトランザクションの外にあるかのように振舞います。
セーブポイントの内部で開かれたカーソルは全て、そのセーブポイントがロールバックした時に閉ざされます。
セーブポイントの前に開かれたカーソルに対しセーブポイント内でFETCHまたはMOVEコマンドを実行した場合、その後、ロールバックされたとしても、カーソルの位置はFETCHの結果、移動した位置から変わりません
(つまりFETCHによる位置の移動はロールバックされません)。
また、カーソルのクローズはロールバックしても取り消すことはできません。
しかしカーソルの問い合わせにより発生するその他の副作用(問い合わせにより呼出される揮発性関数の影響など)は、セーブポイント内で実行され、それがロールバックされた場合に、ロールバックされます。
カーソルの実行によってトランザクションのアボートが引き起こされた場合、そのカーソルは実行不可能状態に遷移します。
この場合、トランザクションはROLLBACK TO SAVEPOINTを使用して戻すことができますが、そのカーソルは使用することができません。
my_savepointの設定後に実行されたコマンドの効果を取り消します。
ROLLBACK TO SAVEPOINT my_savepoint;
セーブポイントへのロールバックは、カーソル位置に影響を与えません。
BEGIN;
DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;
SAVEPOINT foo;
FETCH 1 FROM foo;
?column?
----------
1
ROLLBACK TO SAVEPOINT foo;
FETCH 1 FROM foo;
?column?
----------
2
COMMIT;
標準SQLでは、SAVEPOINTキーワードは必須です。
しかし、PostgreSQLとOracleでは省略することができます。
SQLで使用できるのは、WORKのみです。
TRANSACTIONは使用できず、ROLLBACKの後の意味のない言葉として扱われます。
また、SQLではAND [ NO ] CHAIN句(省略可能)がありますが、これはPostgreSQLでは現在サポートされていません。
その他については、このコマンドは標準SQLと互換性を持ちます。