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;
}
- 高水準言語のファイル処理機能によるコミットメント制御のもとでオー プンされたファイルに基づいてアクセスまたは変更された行。
- トリガー、または CASCADE、SET NULL、あるいは SET DEFAULT 参照保全削除規則の結果として削除、更新、または挿入された行。