COMMIT

COMMIT ステートメントは、作業単位を終了させ、その作業単位によって行われたデータベースの変更をコミットします。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込むことができ、また対話式に呼び出すこともできます。 これは、動的に準備できる実行可能ステートメントです。

トリガー・プログラムとその対象となるプログラムが同じコミットメント定 義のもとで実行される場合、トリガーでは COMMIT は許されません。 リモート・アプリケーション・サーバーへの分散作業単位接続時に呼び出されるプロシージャー、または ATOMIC として定義されているプロシージャーでは、COMMIT を使用することはできません。関数内では COMMIT を使用できません。

権限

権限は不要です。

構文

構文図を読む構文図をスキップする
           .-WORK-.             
>>-COMMIT--+------+--+------+----------------------------------><
                     '-HOLD-'   

説明

COMMIT ステートメントは、そのステートメントが実行される作業単位を終了させ、新たな作業単位を開始します。 このステートメントは、対象の作業単位の中で SQL スキーマ・ ステートメント (DROP SCHEMA を除く) および SQL データ変更 ステートメントにより行われたすべての変更をコミットします。 SQL スキーマ・ステートメントおよび SQL データ変更ステートメントについて詳しくは、ステートメントを参照してください。

解除保留状態の接続は終了します。

WORK
COMMIT WORK は、COMMIT と同じ効果を持ちます。
HOLD
リソースを保持するように指示します。 これを指定すると、HOLD オプションで宣言されているかどうかに関わらず、現在オープンされているカーソルはクローズされません。 その作業単位の過程で獲得したリソースはすべて保留されます。特定の行およびオブジェクトについて、その作業単位の中で暗黙的に獲得されたロックは、解放されます。

クローズされないカーソルに必要なオブジェクト・レベルのロックを除き、暗黙に獲得されたロックは、すべて解放されます。

保留されていないロケーターはすべて解放されます。 保留ロケーターについて詳しくは、HOLD LOCATORを参照してください。

推奨されるコーディング方法: 明示的な COMMIT または ROLLBACK ステートメントを、 アプリケーション・プロセスの最後にコーディングしてください。 アプリケーション環境に応じて、暗黙的なコミットまたはロールバック操作のいずれかが、 アプリケーション・プロセスの終わりに実行されます。 このため、移植可能なアプリケーションでは、 明示的な COMMIT または ROLLBACK が許可された環境で実行が終了する前に、COMMIT または ROLLBACK を明示的に実行する必要があります。

暗黙的な COMMIT または ROLLBACK を以下の環境下で実行することができます。

  • デフォルトの活動化グループの場合
    • デフォルトの活動化グループのもとで実行されているアプリケーションが終了する時点で、暗黙の COMMIT は実行されません。 デフォルトの活動化グループのもとで実行されるプログラムには、対話式 SQL、Query Manager、および非 ILE プログラムなどがあります。
    • 作業をコミットするには、COMMIT を出す必要があります。
  • デフォルト以外の活動化グループで、コミットメント定義の有効範囲がその活動化グループの場合
    • その活動化グループが正常終了する時点で、そのコミットメント定義は暗黙のうちにコミットされます。
    • その活動化グループが異常終了する場合、コミットメント定義は暗黙のうちにロールバックされます。
  • 活動化グループがどのようなタイプであっても、コミットメント定義の有効範囲がジョブであれば、暗黙のコミットが行われることはありません。

コミットの影響: HOLD を使用せずにコミットすると、以下のエラーの原因となります。

  • 解除保留状態の接続は終了します。

    既存の接続の場合

    • 位置指定 UPDATE または DELETE ステートメントを実行するのに先立って、 FETCH ステートメントが必要になる場合でも、 WITH HOLD 文節を使用して宣言されたすべてのオープン・カーソルは保存され、その現在位置は保守されます。
    • 分離レベル NC でオープンされたものを含めて、WITH HOLD 節なしで宣言されたすべてのオープン・カーソルはクローズされます。
  • 保留されていないすべての LOB ロケーターが解放されます。ロケーターが WITH HOLD プロパティーを持つカーソルを通して検索された LOB 値に関連付けられている場合にも、 これが当てはまることに注意してください。
  • LOCK TABLE ステートメントによって獲得されたすべてのロックは解放されます。 クローズされないカーソルに必要なロックを除き、暗黙に獲得されたロックはすべて解放されます。

行ロックの制限: 1 つの作業単位には、最大 4,000,000 行までの処理を組み込むことができます。これには、SELECT や FETCH ステートメントの過程で検索された行1、ならびに、INSERT、DELETE、および UPDATE ステートメントの一部として挿入、削除、または更新された行も含まれます。2

影響されないステートメント: コミットおよびロールバック操作が DROP SCHEMA ステートメントに 影響することはありません。したがって、このステートメントは、COMMIT(*CHG)、COMMIT(*CS)、 COMMIT(*ALL)、または COMMIT(*RR) も 指定しているアプリケーション・プログラムでは使用できません。

COMMIT 制約事項: 2 次スレッドのユーザー定義関数のコミットまたはロールバックは使用できません。

コミットメント定義: SQL で使用されるコミットメント定義は、次のように決められます。

  • SQL を呼び出すプログラムの活動化グループが既に活動化グループ・レベルのコミットメント定義を使用している場合、SQL はそのコミットメント定義を使用します。
  • SQL を呼び出すプログラムの活動化グループがジョブ・レベルのコミットメント定義を使用している場合、SQL はそのジョブ・レベルのコミットメント定義を使用します。
  • SQL を呼び出すプログラムの活動化グループがその時点でコミットメント定義を使用していない場合、ジョブ・コミットメント定義が開始されていれば、SQL はそのジョブ・コミットメント定義を使用します。
  • SQL を呼び出すプログラムの活動化グループがその時点でコミットメント定義を使用しておらず、しかもジョブ・コミットメント定義が開始されていない場合、SQL は暗黙的にコミットメント定義を開始します。SQL は、以下の指定を伴うコミットメント制御開始 (STRCMTCTL) コマンドを使用します。
    • CMTSCOPE(*ACTGRP) パラメーター
    • CRTSQLxxx、STRSQL、または RUNSQLSTM のいずれかのコマンドで指定された COMMIT オプションに基づく LCKLVL パラメーター REXX では、LCKLVL パラメーターは、SET OPTION ステートメントのコミット・オプションに基づきます。

C プログラムの中で、EMPLOYEE 表のある従業員 (EMPNO) から別の従業員へ、ある金額の手数料 (COMM) を移します。 一方の行から手数料の金額を引いた上で、その金額をもう一方の行に加えます。 この両方の操作が正常に完了するまで、データベースへの永続的な変更を行わないように、COMMIT ステートメントを使用します。

void main () 
  {
   
     EXEC SQL  BEGIN DECLARE SECTION;
     decimal(5,2) AMOUNT;
     char FROM_EMPNO[7];
     char TO_EMPNO[7];
     EXEC SQL  END DECLARE SECTION;
     EXEC SQL  INCLUDE SQLCA;
     EXEC SQL  WHENEVER SQLERROR GOTO SQLERR;
     ...
     EXEC SQL  UPDATE EMPLOYEE
               SET COMM = COMM - :AMOUNT
               WHERE EMPNO = :FROM_EMPNO;
     EXEC SQL  UPDATE EMPLOYEE
               SET COMM = COMM + :AMOUNT
               WHERE EMPNO = :TO_EMPNO;
   FINISHED:
     EXEC SQL  COMMIT WORK;
     return;

   SQLERR:
      ...
     EXEC SQL  WHENEVER SQLERROR CONTINUE;  /* continue if error on rollback */
     EXEC SQL  ROLLBACK WORK;
     return;
 }

1 この制限には、次のものも含まれます。
2 COMMIT(*CHG) または COMMIT(*CS) を指定した場合は例外で、これらの行は行数の合計には含まれません。