ROLLBACK ステートメント

ROLLBACK ステートメントは、 作業単位またはセーブポイントにおいてデータベースに加えられた変更を撤回するために使用します。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 このステートメントは、動的に作成できる実行可能ステートメントです。

許可

必要ありません。

構文

Read syntax diagramSkip visual syntax diagramROLLBACKWORK TO SAVEPOINTsavepoint-name

説明

ROLLBACK ステートメントが実行される作業単位は終了し、 新しい作業単位が開始されます。 その作業単位の過程でデータベースに対して行われた変更はすべて取り消されます。

ただし、以下のステートメントはトランザクションによって制御されず、 これらのステートメントによって行われた変更は ROLLBACK ステートメントとは無関係です。

  • SET CONNECTION
  • SET ENCRYPTION PASSWORD
  • SET EVENT MONITOR STATE
  • SET PASSTHRU
    注: SET PASSTHRU ステートメントはトランザクションの制御下にありませんが、このステートメントによって開始されたパススルー・セッションはトランザクションの制御下にあります。
  • SET SERVER OPTION
  • SET 変数
  • 更新可能な特殊レジスターへの割り当て

シーケンスと ID 値の生成は、トランザクションの制御下にはありません。 ROLLBACK ステートメントを発行しても、nextval-expression によって生成されて使用される値や、 ID 列のある表に行を挿入することによって生成されて使用される値には影響を与えません。 また、ROLLBACK ステートメントを発行しても、 prevval-expression によって戻される値と IDENTITY_VAL_LOCAL 関数のどちらにも影響を与えません。

グローバル変数の値の変更は、トランザクションの制御下にはありません。 ROLLBACK ステートメントは、グローバル変数に割り当てられた値に影響を与えません。

TO SAVEPOINT
部分的なロールバック (ROLLBACK TO SAVEPOINT) を実行することを指定します。 現行のセーブポイント・レベルのアクティブなセーブポイントがない場合 (SAVEPOINT ステートメントの 『規則』の節を参照) は、エラーが戻されます (SQLSTATE 3B502)。 セーブポイントは、ロールバックが正常に完了した後もそのまま存続しますが、 ネストされたセーブポイントはすべて解放され、存在しなくなります。 ネストされたセーブポイントがある場合、それらはロールバックされたものとみなされ、 その後、現行セーブポイントへのロールバックへの一部として解放されます。 savepoint-name が指定されない場合は、 現行セーブポイント・レベルでの最新セットのセーブポイントへのロールバックが行われます。

この節を省略して ROLLBACK ステートメントを実行すると、 トランザクション全体がロールバックされます。 また、トランザクション内のセーブポイントは解放されます。

セーブポイント名 (savepoint-name)
ロールバック操作に使用されるセーブポイントを指定します。 savepoint-name を指定する際に、「SYS」で始めることはできません (SQLSTATE 42939)。 ロールバックが正常に完了した後も、その名前のセーブポイントはそのまま存続します。 指定された名前のセーブポイントが存在しない場合は、エラーが戻されます (SQLSTATE 3B001)。 セーブポイントが設定された後に加えられたデータおよびスキーマの変更が取り消されます。

  • ROLLBACK が実行された作業単位では、保持されていたロックがすべて解放されます。 オープン・カーソルはすべてクローズされます。 LOB ロケーターはすべて解放されます。
  • ROLLBACK ステートメントの実行により、 特殊レジスターの値を変更する SET ステートメントまたは RELEASE ステートメントは影響を受けません。
  • プログラムが異常終了した場合は、 暗黙的にその作業単位がロールバックされます。
  • ステートメントのキャッシュは、ロールバック操作の影響を受けます。
  • ROLLBACK TO SAVEPOINT がカーソルに与える影響は、 セーブポイントに含まれているステートメントによって異なります。
    • セーブポイントに DDL が含まれており、この DDL にカーソルが従属している場合、 カーソルは無効としてマークされます。 これらのカーソルを使おうとすると、エラーが戻されます (SQLSTATE 57007)。
    • それ以外の場合は、次のとおりです。
      • セーブポイントで参照されているカーソルは、 オープンされたままになり、結果表の次の論理行の前に置かれます。 (位置指定の UPDATE ステートメントまたは DELETE ステートメントが出される前に、 FETCH を実行する必要があります。)
      • セーブポイントで参照されていないカーソルは、 ROLLBACK TO SAVEPOINT の影響を受けません (元の位置でオープンされたままになります)。
  • パッケージにバインド・オプション KEEPDYNAMIC YES を指定して準備された動的 SQL ステートメントは、ROLLBACK ステートメントの後に SQL コンテキストに保持されます。 その作業単位の中でロールバックされる DDL 操作の結果として、そのステートメントは暗黙的に再度準備される場合があります。
  • パッケージにバインド・オプション KEEPDYNAMIC NO を指定して準備された非アクティブな動的 SQL ステートメントは、ロールバック操作の後に SQL コンテキストから除去されます。 このステートメントを新しいトランザクションで実行する場合、それを再度準備する必要があります。
  • ROLLBACK の際、次の動的 SQL ステートメントがアクティブになっている可能性があります。
    • ROLLBACK ステートメント
    • ROLLBACK ステートメントを実行した CALL ステートメント
  • ROLLBACK TO SAVEPOINT 操作が行われると、 セーブポイントの中で作成されていた作成済み一時表はすべてドロップされます。 作成済み一時表をセーブポイントの中で変更しており、その表がログ対象外として定義されていた場合は、すべての行が表から削除されます。
  • ROLLBACK TO SAVEPOINT 操作が行われると、セーブポイントの中で宣言されていた宣言済み一時表はすべてドロップされます。 宣言済み一時表をセーブポイントの中で変更しており、その表がログ対象外として定義されていた場合は、すべての行が表から削除されます。
  • すべてのロックは、 ROLLBACK TO SAVEPOINT ステートメントの後にも保持されます。
  • すべての LOB ロケーターは、 ROLLBACK TO SAVEPOINT 操作の後にも保持されます。

最後のコミット・ポイントまたはロールバック以後に行われた変更を削除します。
   ROLLBACK WORK