COMMIT 命令の使用

COMMIT 命令は、コミットメント制御下にあるファイルに対する一群の変更を完 了したことをシステムに通知します。 ROLBK 命令は、コミットメント制御下にあるファイルに対する現行グループの 変更を除去します。 これらの命令コードの指定方法および各命令コードの機能については 、「WebSphere Development Studio: ILE RPG 言語解説書」を参照してください。

システム障害の場合には、システムは暗黙に ROLBK 命令を出します。 COMMIT 命令コードの 演算項目 1 に指定したラベル、および STRCMTCTL コマンドに 指定した通知オブジェクトを使用して、正常に完了して いる最後の変更グループの識別を検査することができます。

活動化グループまたはジョブの終わり、あるいは ENDCMTCTL コマンドを出した時には、i5/OS システムは暗黙の ROLBK を出し、これによって、最後に ROLBK または COMMIT 命令が出された後の変更が除去されます。すべてのファイル命令が確実に実行されるようにするには、 コミットメント制御の下で実行している活動化グループまたはジョブの 終了前に、COMMIT 命令を出してください。

OPEN 命令はファイルに対してなされる入出力操作を許可し、CLOSE 命令はファイルに対して なされる入出力操作を停止します。 しかし、OPEN および CLOSE 命令は、COMMIT および ROLBK 命令に 影響しません。 COMMIT または ROLBK 命令は、ファイルがクローズされた後でもファイルに影 響します。 例えば、プログラムに次のステップを組み込むことができます。

  1. COMMIT を出す (既にコミットメント制御の下でオープンされているファ イルに対して)。
  2. コミットメント制御のために指定されているファイルをオープンする。
  3. このファイルに対していくつかの入力および出力操作を実行する。
  4. ファイルをクローズする。
  5. ROLBK を出す。

ステップ 3 で行われた変更は、ステップ 4 でファイルがクローズされていた としても、ステップ 5 の ROLBK 命令によってロールバックされます。ROLBK 命令は同じ 活動化グループまたはジョブ内の別のプログラムから出すことができます。

プログラムがすべてのファイルをコミットメント制御の下で処理しなければ ならないということはありませんし、また、そうすることによって、かえって パフォーマンスが落ちてしまう場合もあります。 COMMIT および ROLBK 命令は、コミットメント制御下にないファイルには影響を 与えません。

注:
複数装置がアプリケーション・プログラムに接続されていて、このプログラムが使用 するファイルに対してコミットメント制御が有効となっている場合には、 COMMIT および ROLBK 命令は、装置によってではなく、ファイルに基づいて作 業を続行します。 データベースは部分的に完了した COMMIT ブロックで更新されるか、あるいは他のユーザーが完了した変更が 削除されることもあります。 これが確実に起こらないようにすることは、ユーザーの責任です。

コミットメント制御の使用例

この例は、プログラムをコミットメント制御の下で機能させるために必要な仕 様および CL コマンドを説明したものです。

コミットメント制御の使用を準備するためには、次の CL コマンドを出してく ださい。

  1. CRTJRNRCV JRNRCV(RECEIVER)

    このコマンドはジャーナル・レシーバー RECEIVER を作成します。

  2. CRTJRN JRN(JOURNAL) JRNRCV(RECEIVER)

    このコマンドはジャーナル JOURNAL を作成し、ジャーナル・レシーバー RECEIVER を接続します。

  3. STRJRNPF FILE(MASTER TRANS) JRN(JOURNAL)

    このコマンドはファイル MASTER およびファイル TRANS のジャーナル項目を ジャーナル JOURNAL に入れます。

プログラムでは、ファイル MASTER およびファイル TRANS に COMMIT を指定し ます。

図 176. コミットメント制御の使用例
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *
FFilename++IPEASFRlen+LKlen+AIDevice+.Keywords+++++++++++++++++++++++
FMASTER    UF   E      K      DISK    COMMIT
FTRANS     UF   E      K      DISK    COMMIT
F*
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C                   :
C                   :
 *
 *  一連の命令が正常に完了した場合には COMMIT 命令を使用し、
 *  正常に完了しなかった場合は変更を
 *  ロールバックします。
 *
C                   UPDATE    MAST_REC                             90
C                   UPDATE    TRAN_REC                             91
C                   IF        *IN90 OR *IN91
C                   ROLBK
C                   ELSE
C                   COMMIT
C                   ENDIF

プログラム (REVISE という名前) をコミットメント制御の下で機能させるた めには、次のコマンドを出します。

  1. STRCMTCTL LCKLVL(*ALL)

    このコマンドは、最高レベルのロックでコミットメント制御を開始します。

  2. CALL REVISE

    このコマンドはプログラム REVISE を呼び出します。

  3. ENDCMTCTL

    このコマンドはコミットメント制御を終了し、暗黙ロールバック操作を行い ます。