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と互換性を持ちます。