第10章  Commit/Rollback
RPGプログラマーの為のC言語講座

文章だとなかなか解りにくいので、実際にテストプログラムで検証しましょう

まず、テストで使用するファイルとジャーナルを準備しましょう。

【CMTPF】テスト用の物理ファイル

 A                                      UNIQUE
 A          R CMTR
 A            KEY            1A         COLHDG('A FLD')
 A            P01           10P 0       COLHDG('P FILD')
 A            S01           10S 0       COLHDG('S FLD')
 A            O01           20O         COLHDG('O FLD')
 A          K KEY

【CMTCL】テスト用の物理ファイルセットアップCL

  PGM
  CRTPF      FILE(CMTPF)
  CRTJRNRCV  JRNRCV(CLAB/CMTJRN) THRESHOLD(5000)
  CRTJRN     JRN(CLAB/CMTJRN) JRNRCV(CLAB/CMTJRN) +
             MNGRCV(*SYSTEM)
  STRJRNPF   FILE(CLAB/CMTPF) JRN(CLAB/CMTJRN) IMAGES(*BOTH)
  ENDPGM

[プログラムの解説]

    物理ファイルをコンパイルし、ジャーナルレシーバーを作成(最少の5000レコード)し、
    ジャーナルを作成(レシーバーの切り替えはOSまかせ)し、物理ファイルにジャーナルを
    開始します。

    もちろん、CLプログラムにせず、上記コマンドを順番に実行しても構いません。

    これで、ファイルの準備はできました。次にプログラムを準備しましょう

    プログラムは、WIRTE/UPDATE/READ/DELETE毎に1本ずつになっています。
    すべてのプログラムは、ディスプレイ命令でPGMを中断し、「COMMIT/ROLLBACK/何もしない」の指示が対話式に 出来るようになっています。


AS/400のILE−Cは、RPGと同じ方法でコミットメントの利用が可能です。

第5章 F仕様書 で出て来たILE−Cの拡張関数を使用して、
コミットメント制御を行う事がですます。

各関数は_Rxxxx ではじまる名前になっており、recio.h で定義されています。

_Racquire           _Rclose            _Rcommit          _Rdelete
_Rdevatr            _Rfeod             _Rfeov            _Rformat
_Rindara            _Riofbk            _Rlocate          _Ropen
_Ropnfbk            _Rpgmdev           _Rreadd           _Rreadf
_Rreadindv          _Rreadk            _Rreadl           _Rreadn
_Rreadnc            _Rreadp            _Rreads           _Rrelease
_Rrlslck            _Rrollbck          _Rupdate          _Rupfb
_Rwrite             _Rwrited           _Rwriterd         _Rwrread

【CMT01】レコード追加プログラム

C言語版はこちら
  FCMTPF   O   E                    DISK                  A
  F                                              KCOMIT
  E                    TEXT    1   1 50
  C*
  C                     MOVE 'A'       KEY
  C                     WRITECMTR
  C                     MOVE 'B'       KEY
  C                     WRITECMTR
  C*
  C           TEXT,1    DSPLY          SWTCH   1       
  C*
  C           SWTCH     IFEQ 'C'
  C                     COMIT
  C                     ENDIF
  C           SWTCH     IFEQ 'R'
  C                     ROLBK
  C                     ENDIF
  C*
  C                     SETON                     LR
  C                     RETRN
**
WRITE ? (C=COMMIT R=ROOLBACK)

【CMT02】レコード更新プログラム

C言語版はこちら
  FCMTPF   UF  E           K        DISK
  F                                              KCOMIT
  E                    TEXT    1   1 50
  C*
  C                     READ CMTR                     99
  C                     ADD  1         S01
  C                     UPDATCMTR
  C                     READ CMTR                     99
  C                     ADD  1         S01
  C                     UPDATCMTR
  C           TEXT,1    DSPLY          SWTCH   1    
  C*
  C           SWTCH     IFEQ 'C'
  C                     COMIT
  C                     ENDIF
  C           SWTCH     IFEQ 'R'
  C                     ROLBK
  C                     ENDIF
  C*
  C                     SETON                     LR
  C                     RETRN
**
UPDATE ? (C=COMMIT R=ROOLBACK)

【CMT03】レコード読み取りプログラム

C言語版はこちら
  FCMTPF   IF  E           K        DISK
  F                                              KCOMIT
  E                    TEXT    1   2 50
  C*
  C           'A'       SETLLCMTPF
  C                     READ CMTR                     99
  C           TEXT,1    DSPLY
  C                     READ CMTR                     99
  C           TEXT,2    DSPLY          SWTCH   1
  C*
  C           SWTCH     IFEQ 'C'
  C                     COMIT
  C                     ENDIF
  C           SWTCH     IFEQ 'R'
  C                     ROLBK
  C                     ENDIF
  C*
  C                     SETON                     LR
  C                     RETRN
**
1レコードREADしました。
READ  ? (C=COMMIT R=ROOLBACK)

【CMT04】レコード削除プログラム

C言語版はこちら
  FCMTPF   UF  E           K        DISK
  F                                              KCOMIT
  E                    TEXT    1   1 50
  C*
  C                     READ CMTR                     99
  C                     DELETCMTR
  C                     READ CMTR                     99
  C                     DELETCMTR
  C           TEXT,1    DSPLY          SWTCH   1   
  C*
  C           SWTCH     IFEQ 'C'
  C                     COMIT
  C                     ENDIF
  C           SWTCH     IFEQ 'R'
  C                     ROLBK
  C                     ENDIF
  C*
  C                     SETON                     LR
  C                     RETRN
**
DELETE ? (C=COMMIT R=ROOLBACK)

    これで、テストの準備はできました。

    2台の端末でプログラムを実行し、COMMIT/ROLLBACKの動きを検証します。
    実行する順番は、「端末1」,「端末2」の順で実行するものとします。

端末1:STRCMTCTL COMMIT(*CHG)/端末2:STRCMTCTL COMMIT(*CHG)のケース

    端末1:CALL CMT01(COMMITもROLLBOACKもせずに終了)
    端末2:
    • CALL CMT01(WIRTE)
        重複キーレコードの書き出しエラー発生
    • CALL CMT02(UPDATE)
        ロックウェイト
    • CALL CMT03(READ)
        正常終了(2レコード読み込み)
    • CALL CMT04(DELETE)
        ロックウェイト

端末1:STRCMTCTL COMMIT(*CS)/端末2:STRCMTCTL COMMIT(*CS)のケース

    端末1:CALL CMT01(COMMITもROLLBOACKもせずに終了)
    端末2:
    • CALL CMT01(WIRTE)
        重複キーレコードの書き出しエラー発生
    • CALL CMT02(UPDATE)
        ロックウェイト
    • CALL CMT03(READ)
        正常終了(2レコード読み込み)
    • CALL CMT04(DELETE)
        ロックウェイト

端末1:STRCMTCTL COMMIT(*ALL)/端末2:STRCMTCTL COMMIT(*ALL)のケース

    端末1:CALL CMT01(COMMITもROLLBOACKもせずに終了)
    端末2:
    • CALL CMT01(WIRTE)
        重複キーレコードの書き出しエラー発生
    • CALL CMT02(UPDATE)
        ロックウェイト
    • CALL CMT03(READ)
        ロックウェイト
    • CALL CMT04(DELETE)
        ロックウェイト
注)C言語版を使用する場合は、ACTGRPに注意して下さい。

残念ながら、ここではすべてのケースの結果を掲載出来ませんので、他のケースについては、ご自身の環境で実行してご検証下さい。

WRKJOBコマンドでコミットメント状況や、ロックの内容について確認でき、
DSPJRNコマンドで、コミットメント制御/コミットメントサイクルなどのジャーナル項目が確認できます。

内容を確認してみると、実際の動作が理解できることと思います。