SAVEPOINT <refpurpose>define a new savepoint within the current transaction</refpurpose> — 現在のトランザクション内に新規にセーブポイントを定義する
SAVEPOINT savepoint_name
<command>SAVEPOINT</command> establishes a new savepoint within
the current transaction.
SAVEPOINT
は、現在のトランザクション内に新しいセーブポイントを設定します。
A savepoint is a special mark inside a transaction that allows all commands that are executed after it was established to be rolled back, restoring the transaction state to what it was at the time of the savepoint. セーブポイントとはトランザクション内に付ける特別な印です。セーブポイントを設定しておくと、それ以降に実行されたコマンドを全てロールバックし、トランザクションを設定時の状態に戻すことができます。
savepoint_name
The name to give to the new savepoint. If savepoints with the same name already exist, they will be inaccessible until newer identically-named savepoints are released. 新しいセーブポイントに付与する名前。 同じ名前のセーブポイントが既に存在する場合には、より新しい同一の名前のセーブポイントが解放されるまで使用できなくなります。
Use <link linkend="sql-rollback-to"><command>ROLLBACK TO</command></link> to
rollback to a savepoint. Use <link linkend="sql-release-savepoint"><command>RELEASE SAVEPOINT</command></link>
to destroy a savepoint, keeping
the effects of commands executed after it was established.
セーブポイントまでロールバックするにはROLLBACK TO
を使用してください。
セーブポイント後に行われたコマンドの効果を保持したままセーブポイントを破棄するには、RELEASE SAVEPOINT
を使用してください。
Savepoints can only be established when inside a transaction block. There can be multiple savepoints defined within a transaction. セーブポイントはトランザクションブロックの内側のみに設定することができます。 1つのトランザクションの中には、複数のセーブポイントを設定することができます。
To establish a savepoint and later undo the effects of all commands executed after it was established: セーブポイントを設定し、その後に実行した全てのコマンドの効果を取り消します。
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;
The above transaction will insert the values 1 and 3, but not 2. 上記のトランザクションでは、1と3は挿入されますが、2は挿入されません。
To establish and later destroy a savepoint: セーブポイントを設定し、その後に破棄します。
BEGIN; INSERT INTO table1 VALUES (3); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (4); RELEASE SAVEPOINT my_savepoint; COMMIT;
The above transaction will insert both 3 and 4. 上記のトランザクションでは、3と4の両方が挿入されます。
To use a single savepoint name: 単一のセーブポイント名を使用します。
BEGIN; INSERT INTO table1 VALUES (1); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (2); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (3); -- rollback to the second savepoint -- 2番目のセーブポイントまでロールバック ROLLBACK TO SAVEPOINT my_savepoint; SELECT * FROM table1; -- shows rows 1 and 2 SELECT * FROM table1; -- 行 1 と 2 を表示 -- release the second savepoint -- 2番目のセーブポイントを解放 RELEASE SAVEPOINT my_savepoint; -- rollback to the first savepoint -- 1番目のセーブポイントまでロールバック ROLLBACK TO SAVEPOINT my_savepoint; SELECT * FROM table1; -- shows only row 1 SELECT * FROM table1; -- 行 1 のみを表示 COMMIT;
The above transaction shows row 3 being rolled back first, then row 2. 上記のトランザクションでは、まず行 3 がロールバックされ、次に行 2 がロールバックされます。
SQL requires a savepoint to be destroyed automatically when another
savepoint with the same name is established. In
<productname>PostgreSQL</productname>, the old savepoint is kept, though only the more
recent one will be used when rolling back or releasing. (Releasing the
newer savepoint with <command>RELEASE SAVEPOINT</command> will cause the older one
to again become accessible to <command>ROLLBACK TO SAVEPOINT</command> and
<command>RELEASE SAVEPOINT</command>.) Otherwise, <command>SAVEPOINT</command> is
fully SQL conforming.
SQLでは、同じ名前のセーブポイントが設定された時は、自動的に古い方のセーブポイントを破棄することになっています。
PostgreSQLでは、古いセーブポイントも保持されますが、ロールバックや解放時には新しい方のセーブポイントが使用されます。
(RELEASE SAVEPOINT
を用いて新しいセーブポイントが解放されると、再びROLLBACK TO SAVEPOINT
やRELEASE SAVEPOINT
から古いセーブポイントが使用できるようになります。)
この点以外は、SAVEPOINT
は完全にSQLに従っています。