ROLLBACK TO SAVEPOINT <refpurpose>roll back to a savepoint</refpurpose> — セーブポイントまでロールバックする
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name
Roll back all commands that were executed after the savepoint was established and then start a new subtransaction at the same transaction level. The savepoint remains valid and can be rolled back to again later, if needed. セーブポイントの設定後に実行されたコマンドをすべてロールバックして、同じトランザクションレベルで新しいサブトランザクションを開始します。 セーブポイントは有効なまま残るので、必要に応じて、その後再度ロールバックすることができます。
<command>ROLLBACK TO SAVEPOINT</command> implicitly destroys all savepoints that
were established after the named savepoint.
ROLLBACK TO SAVEPOINT
は、指定したセーブポイントより後に設定した全てのセーブポイントを暗黙的に破棄します。
savepoint_name
The savepoint to roll back to. ロールバック先のセーブポイントです。
Use <link linkend="sql-release-savepoint"><command>RELEASE SAVEPOINT</command></link> to destroy a savepoint
without discarding the effects of commands executed after it was
established.
セーブポイントの設定後に実行されたコマンドの結果を維持したままセーブポイントを破棄するには、RELEASE SAVEPOINT
を使用してください。
Specifying a savepoint name that has not been established is an error. 設定されていないセーブポイントの名前を指定するとエラーになります。
Cursors have somewhat non-transactional behavior with respect to
savepoints. Any cursor that is opened inside a savepoint will be closed
when the savepoint is rolled back. If a previously opened cursor is
affected by a <command>FETCH</command> or <command>MOVE</command> command inside a
savepoint that is later rolled back, the cursor remains at the
position that <command>FETCH</command> left it pointing to (that is, the cursor
motion caused by <command>FETCH</command> is not rolled back).
Closing a cursor is not undone by rolling back, either.
However, other side-effects caused by the cursor's query (such as
side-effects of volatile functions called by the query) <emphasis>are</emphasis>
rolled back if they occur during a savepoint that is later rolled back.
A cursor whose execution causes a transaction to abort is put in a
cannot-execute state, so while the transaction can be restored using
<command>ROLLBACK TO SAVEPOINT</command>, the cursor can no longer be used.
カーソルはセーブポイントという観点から見るとトランザクションの外にあるかのように振舞います。
セーブポイントの内部で開かれたカーソルは全て、そのセーブポイントがロールバックした時に閉ざされます。
セーブポイントの前に開かれたカーソルに対しセーブポイント内でFETCH
またはMOVE
コマンドを実行した場合、その後、ロールバックされたとしても、カーソルの位置はFETCH
の結果、移動した位置から変わりません
(つまりFETCH
による位置の移動はロールバックされません)。
また、カーソルのクローズはロールバックしても取り消すことはできません。
しかしカーソルの問い合わせにより発生するその他の副作用(問い合わせにより呼出される揮発性関数の影響など)は、セーブポイント内で実行され、それがロールバックされた場合に、ロールバックされます。
カーソルの実行によってトランザクションのアボートが引き起こされた場合、そのカーソルは実行不可能状態に遷移します。
この場合、トランザクションはROLLBACK TO SAVEPOINT
を使用して戻すことができますが、そのカーソルは使用することができません。
To undo the effects of the commands executed after <literal>my_savepoint</literal>
was established:
my_savepoint
の設定後に実行されたコマンドの効果を取り消します。
ROLLBACK TO SAVEPOINT my_savepoint;
Cursor positions are not affected by savepoint rollback: セーブポイントへのロールバックは、カーソル位置に影響を与えません。
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;
The <acronym>SQL</acronym> standard specifies that the key word
<literal>SAVEPOINT</literal> is mandatory, but <productname>PostgreSQL</productname>
and <productname>Oracle</productname> allow it to be omitted. SQL allows
only <literal>WORK</literal>, not <literal>TRANSACTION</literal>, as a noise word
after <literal>ROLLBACK</literal>. Also, SQL has an optional clause
<literal>AND [ NO ] CHAIN</literal> which is not currently supported by
<productname>PostgreSQL</productname>. Otherwise, this command conforms to
the SQL standard.
標準SQLでは、SAVEPOINT
キーワードは必須です。
しかし、PostgreSQLとOracleでは省略することができます。
SQLで使用できるのは、WORK
のみです。
TRANSACTION
は使用できず、ROLLBACK
の後の意味のない言葉として扱われます。
また、SQLではAND [ NO ] CHAIN
句(省略可能)がありますが、これはPostgreSQLでは現在サポートされていません。
その他については、このコマンドは標準SQLと互換性を持ちます。