COMMIT (SQL)
構文
COMMIT [WORK]
概要
COMMIT 文は、現在のトランザクション中に完了したすべての処理をコミットし、トランザクション・レベル・カウンタをリセットして、設定されたすべてのロックを解除します。これによりトランザクションが完了します。コミットされた処理はロールバックできません。
COMMIT 文と COMMIT WORK 文は同等です。両者には互換性があります。
トランザクションは、トランザクションの開始を表す START TRANSACTION 文を含む操作として定義されます。COMMIT を実行すると、トランザクション・レベル・カウンタ ($TLEVEL) が、そのトランザクションを初期化した START TRANSACTION 文の直前の状態にリストアされます (InterSystems SQL は入れ子になったトランザクションをサポートしないため、トランザクション内で START TRANSACTION 文を追加発行しても、トランザクションの初期化ポイントには影響しません)。
単一の COMMIT によりトランザクション内のすべてのセーブポイントがコミットされます。
START TRANSACTION 文は新しいトランザクションを明示的に開始するものです。ただし、START TRANSACTION を使用するかどうかは任意です。トランザクション処理がアクティブなとき、最初のデータベース操作に続いて COMMIT が実行されると、新しいトランザクションが暗黙的に開始されます。トランザクション処理が反映されない場合や、自動コミットによって反映される場合、COMMIT 文は意味を持ちません。進行中のトランザクションがなければ、COMMIT は正常に完了しますが (SQLCODE 0)、処理は何も実行されません。
クエリでの COMMIT の結果は現在の分離レベルによって異なります。これらのトランザクション・パラメータは、SET TRANSACTION または START TRANSACTION コマンドのどちらでも設定できます。
トランザクションの動作が正常完了できなかった場合は、SQLCODE -400 が発行されます。
ObjectScript と SQL のトランザクション
ObjectScript と SQL のトランザクション・コマンドは完全に互換性があり、置き換え可能ですが、以下の例外があります。
ObjectScript TSTART と SQL START TRANSACTION はどちらも、トランザクションが進行中でない場合にトランザクションを開始します。ただし、START TRANSACTION では、入れ子になったトランザクションはサポートされません。そのため、入れ子になったトランザクションが必要な場合 (または必要になる可能性がある場合) には、トランザクションを TSTART で始めることをお勧めします。SQL 標準との互換性が必要な場合は、START TRANSACTION を使用してください。
ObjectScript トランザクション処理は、入れ子になったトランザクションを限定的にサポートします。SQL トランザクション処理はトランザクション内のセーブポイントをサポートします。
トランザクションに SQL 更新文が含まれる場合、SQL の START TRANSACTION 文でトランザクションが開始され、COMMIT 文でコミットされます。TSTART/TCOMMIT を入れ子にして使用するメソッドは、トランザクションを開始するものでなければ、トランザクションに組み込むことができます。メソッドとストアド・プロシージャは、通常、設計でトランザクションの主要なコントローラにならない限り、SQL トランザクション制御文を使用しません。ストアド・プロシージャは、独自のトランザクション制御モデルの ODBC/JDBC から呼び出されるため、通常 SQL トランザクション制御文を使用しません。
例
以下の埋め込み SQL の例は、トランザクション内で確立された SAVEPOINTS の数に関係なく、COMMIT がトランザクション・レベル・カウンタ ($TLEVEL) を START TRANSACTION の直前のレベルにリストアする方法を示しています。このプログラム内の 2 番目の START TRANSACTION は、$TLEVEL に影響しない空命令です。
&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(START TRANSACTION) /* Performs no operation */
WRITE !,"Start transaction, SQLCODE=",SQLCODE
WRITE !,"Transaction level=",$TLEVEL
&sql(SAVEPOINT c)
WRITE !,"Set Savepoint c, SQLCODE=",SQLCODE
WRITE !,"Transaction level=",$TLEVEL
&sql(COMMIT)
WRITE !,"Commit transaction, SQLCODE=",SQLCODE
WRITE !,"Transaction level=",$TLEVEL
以下の埋め込み SQL の例では、COMMIT 文がトランザクション全体をコミットします。余分な COMMIT 文は何も影響を与えず、エラーも発生しません。
&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(COMMIT)
WRITE !,"Commit transaction, SQLCODE=",SQLCODE
WRITE !,"Transaction level=",$TLEVEL
&sql(COMMIT) /* Performs no operation */
WRITE !,"Commit again, SQLCODE=",SQLCODE
WRITE !,"Transaction level=",$TLEVEL
&sql(COMMIT) /* Performs no operation */
WRITE !,"Commit again, SQLCODE=",SQLCODE
WRITE !,"Transaction level=",$TLEVEL
関連項目
-
SQL コマンド : ROLLBACK SAVEPOINT SET TRANSACTION START TRANSACTION $TLEVEL
-
ObjectScript コマンド: TCOMMIT