ROLLBACK (SQL)
構文
ROLLBACK [WORK]
ROLLBACK TO SAVEPOINT pointname
概要
ROLLBACK 文は、トランザクション をロール・バックし、実行したけれどもコミットされていない作業を元に戻し、$TLEVEL トランザクション・レベル・カウンタをディクリメントしてロックを解除します。ROLLBACK を使用すると、以前の一貫性のある状態にデータベースをリストアすることができます。
-
ROLLBACK は現在のトランザクションの間に実行されたすべての作業をロール・バックし、$TLEVEL トランザクション・レベル・カウンタをゼロにリセットして、すべてのロックを解除します。これにより、データベースはトランザクションが開始される前の状態にリストアされます。ROLLBACK 文と ROLLBACK WORK 文は同等です。両者には互換性があります。
-
ROLLBACK TO SAVEPOINT pointname は、指定されたセーブポイント以降に実行されたすべての作業をロール・バックし、元に戻したセーブポイントの数だけ $TLEVEL トランザクション・レベル・カウンタをディクリメントします。すべてのセーブポイントがロール・バックまたはコミットされ、トランザクション・レベル・カウンタがゼロにリセットされると、トランザクションは完了します。指定されたセーブポイントが存在しない場合、または既にロール・バックされている場合、ROLLBACK は SQLCODE -375 エラーを発行し、現在のトランザクション全体をロール・バックします。
ROLLBACK TO SAVEPOINT では、pointname を指定する必要があります。これを実行しないと、SQLCODE -301 エラーが返されます。
セーブポイントの設定方法の詳細は、"SAVEPOINT" を参照してください。
トランザクションの動作が正常完了できなかった場合は、SQLCODE -400 エラーが発行されます。
ロールバック対象外
以下のものは ROLLBACK 操作の影響を受けません。
-
ロール・バックでは既定クラスの IDKey カウンタをディクリメントしません。IDKey は $INCREMENT (または $SEQUENCE) によって自動的に生成されます。そこでは SQL トランザクションとは別にカウントを保持しています。
-
ロール・バックでは、クエリ・キャッシュの作成、変更、および削除は元に戻りません。これらの処理は、トランザクションの一部として処理されません。
-
トランザクション中に発生する DDL 操作やテーブル・チューニング操作は、一時ルーチンを作成したり実行する場合があります。この一時ルーチンは、クエリ・キャッシュと同様に処理されます。つまり、一時ルーチンの作成、コンパイル、および削除はトランザクションの一部として処理されません。一時ルーチンの実行は、トランザクションの一部であると見なされます。
ロールバックされるまたはロールバックされない非 SQL 項目については、ObjectScript の "TROLLBACK" コマンドを参照してください。
ロールバックのロギング
ロールバックが発生したことを示すメッセージ、およびロールバック処理中に発生したエラーは、MGR ディレクトリの messages.log ファイルにログ記録されます。管理ポータルの [システム処理]→[システムログ]→[メッセージログ] オプションを使用して、messages.log を表示できます。
一時停止されたトランザクション
%SYSTEM.ProcessOpens in a new tab クラスの TransactionsSuspended()Opens in a new tab メソッドを使用して、プロセスの現在のすべてのトランザクションを一時停止および再開することができます。トランザクションを一時停止すると、変更のジャーナリングが一時停止されます。したがって、現在のトランザクション中にトランザクションの一時停止が発生した場合、トランザクションが一時停止されているときに行われた変更は、ROLLBACK によってロールバックできません。ただし、ROLLBACK は、トランザクションの一時停止が有効になる前または後に発生した、現在のトランザクション中に行われたすべての変更をロールバックします。
詳細は、"トランザクション処理での ObjectScript の使用法" を参照してください。
ObjectScript :トランザクション・コマンド
ObjectScript と SQL のトランザクション・コマンドは完全に互換性があり、置き換え可能ですが、以下の例外があります。
ObjectScript TSTART と SQL START TRANSACTION はどちらも、トランザクションが進行中でない場合にトランザクションを開始します。ただし、START TRANSACTION では、入れ子になったトランザクションはサポートされません。そのため、入れ子になったトランザクションが必要な場合 (または必要になる可能性がある場合) には、トランザクションを TSTART で始めることをお勧めします。SQL 標準との互換性が必要な場合は、START TRANSACTION を使用してください。
ObjectScript トランザクション処理は、入れ子になったトランザクションを限定的にサポートします。SQL トランザクション処理はトランザクション内のセーブポイントをサポートします。
例
以下の埋め込み SQL の例は、ROLLBACK がトランザクション・レベル・カウンタ ($TLEVEL) を START TRANSACTION の直前のレベルである 0 にリストアする方法を示しています。
&sql(SET TRANSACTION %COMMITMODE EXPLICIT)
WRITE !,"Set transaction mode, SQLCODE=",SQLCODE
WRITE !,"Transaction level=",$TLEVEL
&sql(START TRANSACTION)
WRITE !,"Start transaction, SQLCODE=",SQLCODE
WRITE !,"Transaction level=",$TLEVEL
&sql(SAVEPOINT a)
WRITE !,"Set Savepoint a, SQLCODE=",SQLCODE
WRITE !,"Transaction level=",$TLEVEL
&sql(SAVEPOINT b)
WRITE !,"Set Savepoint b, SQLCODE=",SQLCODE
WRITE !,"Transaction level=",$TLEVEL
&sql(SAVEPOINT c)
WRITE !,"Set Savepoint c, SQLCODE=",SQLCODE
WRITE !,"Transaction level=",$TLEVEL
&sql(ROLLBACK)
WRITE !,"Rollback transaction, SQLCODE=",SQLCODE
WRITE !,"Transaction level=",$TLEVEL
以下の埋め込み SQL の例は、ROLLBACK TO SAVEPOINT name が、トランザクション・レベル ($TLEVEL) を指定された SAVEPOINT の直前のレベルにリストアする方法を示しています。
&sql(SET TRANSACTION %COMMITMODE EXPLICIT)
WRITE !,"Set transaction mode, SQLCODE=",SQLCODE
WRITE !,"Transaction level=",$TLEVEL
&sql(START TRANSACTION)
WRITE !,"Start transaction, SQLCODE=",SQLCODE
WRITE !,"Transaction level=",$TLEVEL
&sql(SAVEPOINT a)
WRITE !,"Set Savepoint a, SQLCODE=",SQLCODE
WRITE !,"Transaction level at a=",$TLEVEL
&sql(SAVEPOINT b)
WRITE !,"Set Savepoint b, SQLCODE=",SQLCODE
WRITE !,"Transaction level at b=",$TLEVEL
&sql(ROLLBACK TO SAVEPOINT b)
WRITE !,"Rollback to b, SQLCODE=",SQLCODE
WRITE !,"Rollback transaction level=",$TLEVEL
&sql(SAVEPOINT c)
WRITE !,"Set Savepoint c, SQLCODE=",SQLCODE
WRITE !,"Transaction level at c=",$TLEVEL
&sql(SAVEPOINT d)
WRITE !,"Set Savepoint d, SQLCODE=",SQLCODE
WRITE !,"Transaction level at d=",$TLEVEL
&sql(COMMIT)
WRITE !,"Commit transaction, SQLCODE=",SQLCODE
WRITE !,"Transaction level=",$TLEVEL
引数
pointname
既存のセーブポイントの名前。識別子として指定します。
関連項目
-
SQL コマンド: COMMIT、SAVEPOINT、SET TRANSACTION、START TRANSACTION、$TLEVEL
-
ObjectScript : TROLLBACK
-
ObjectScript : トランザクション処理