文章だとなかなか解りにくいので、実際にテストプログラムで検証しましょう
まず、テストで使用するファイルとジャーナルを準備しましょう。
【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)
|
端末1:STRCMTCTL COMMIT(*CHG)/端末2:STRCMTCTL COMMIT(*CHG)のケース
端末1:CALL CMT01(COMMITもROLLBOACKもせずに終了)
端末2:
- CALL CMT01(WIRTE)
- CALL CMT02(UPDATE)
- CALL CMT03(READ)
- 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)
- 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コマンドで、コミットメント制御/コミットメントサイクルなどのジャーナル項目が確認できます。
内容を確認してみると、実際の動作が理解できることと思います。
|