Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

ROLLBACK

トランザクションをロール・バックします。

Synopsis

ROLLBACK [WORK] 
ROLLBACK TO SAVEPOINT pointname

引数

pointname 既存のセーブポイントの名前。識別子として指定します。詳細は、"Caché SQL の使用法" の “識別子” の章を参照してください。

概要

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 ディレクトリの cconsole.log ファイルにログ記録されます。管理ポータルの [システム操作] オプションを使用して、cconsole.log を表示できます (システム, システムログ, コンソールログの表示)。

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

関連項目

FeedbackOpens in a new tab