他のバージョンの文書 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

SAVEPOINT

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 SAVEPOINTRELEASE SAVEPOINTから古いセーブポイントが使用できるようになります。) この点以外は、SAVEPOINTは完全にSQLに従っています。

関連項目

BEGIN, COMMIT, RELEASE SAVEPOINT, ROLLBACK, ROLLBACK TO SAVEPOINT