ROLLBACK [ WORK ] [ THEN statements ] [ ELSE statements ]
ROLLBACK ステートメントを使用すると、トランザクション実行中にファイル入出力に行われるすべての変更を中止できます。 WORK キーワードは、SQL 構文の表記ルールと互換性を持ちます。つまりコンパイル時に無視されます。
トランザクションには、最新の BEGIN TRANSACTION ステートメント以降に実行されたステートメントすべてが含まれています。ROLLBACK ステートメントは、アクティブなトランザクションでファイルに対して行われたすべての変更を元に戻します。 従属トランザクションがロールバックする場合、アクティブ従属トランザクションによる変更は、親トランザクションに何の影響も与えません。一番上のトランザクションがロールバックされた場合、変更内容はディスクにコミットされず、データベースはトランザクションの影響を受けません。
ROLLBACK ステートメントを COMMIT ステートメントなしのトランザクションで使用すると、可能性のある変更の結果を検討することができます。このように使用しても、親トランザクションまたはデータベースへの影響はありません。 ROLLBACK ステートメントを実行すると、現在のトランザクションが終了します。 トランザクションが終了すると、次の END TRANSACTION ステートメントの直後にあるステートメントから実行が続けられます。
トランザクションがアクティブでない場合、ROLLBACK ステートメントは、実行時の警告を生成し、ELSE ステートメントが実行されます。
この例は、ロックを rec1 と rec2 に適用するトランザクションで始まります。エラーが発生した場合 (失敗または WRITE 文の失敗など)、ROLLBACK 文は、ファイルに何の変更も書き込まれていないことを確実にします。
BEGIN TRANSACTION
READU data1 FROM file1,rec1 ELSE ROLLBACK
READU data2 FROM file2,rec2 ELSE ROLLBACK
.
.
.
WRITE new.data1 ON file1,rec1 ELSE ROLLBACK
WRITE new.data2 ON file2,rec2 ELSE ROLLBACK
COMMIT WORK
END TRANSACTION
rec1 に掛かった更新レコード・ロックは、最初の WRITE ステートメントが正常に実行された時点では解放されません。