SAVEPOINT — 現在のトランザクション内に新規にセーブポイントを定義する
SAVEPOINT savepoint_name
SAVEPOINT
は、現在のトランザクション内に新しいセーブポイントを設定します。
セーブポイントとはトランザクション内に付ける特別な印です。セーブポイントを設定しておくと、それ以降に実行されたコマンドを全てロールバックし、トランザクションを設定時の状態に戻すことができます。
savepoint_name
新しいセーブポイントに付与する名前。 同じ名前のセーブポイントが既に存在する場合には、より新しい同一の名前のセーブポイントが解放されるまで使用できなくなります。
セーブポイントまでロールバックするにはROLLBACK TO
を使用してください。
セーブポイント後に行われたコマンドの効果を保持したままセーブポイントを破棄するには、RELEASE SAVEPOINT
を使用してください。
セーブポイントはトランザクションブロックの内側のみに設定することができます。 1つのトランザクションの中には、複数のセーブポイントを設定することができます。
セーブポイントを設定し、その後に実行した全てのコマンドの効果を取り消します。
BEGIN; INSERT INTO table1 VALUES (1); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (2); ROLLBACK TO SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (3); COMMIT;
上記のトランザクションでは、1と3は挿入されますが、2は挿入されません。
セーブポイントを設定し、その後に破棄します。
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 my_savepoint; INSERT INTO table1 VALUES (2); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (3); -- 2番目のセーブポイントまでロールバック ROLLBACK TO SAVEPOINT my_savepoint; SELECT * FROM table1; -- 行 1 と 2 を表示 -- 2番目のセーブポイントを解放 RELEASE SAVEPOINT my_savepoint; -- 1番目のセーブポイントまでロールバック ROLLBACK TO SAVEPOINT my_savepoint; SELECT * FROM table1; -- 行 1 のみを表示 COMMIT;
上記のトランザクションでは、まず行 3 がロールバックされ、次に行 2 がロールバックされます。
SQLでは、同じ名前のセーブポイントが設定された時は、自動的に古い方のセーブポイントを破棄することになっています。
PostgreSQLでは、古いセーブポイントも保持されますが、ロールバックや解放時には新しい方のセーブポイントが使用されます。
(RELEASE SAVEPOINT
を用いて新しいセーブポイントが解放されると、再びROLLBACK TO SAVEPOINT
やRELEASE SAVEPOINT
から古いセーブポイントが使用できるようになります。)
この点以外は、SAVEPOINT
は完全にSQLに従っています。