RPG でのレコード・アクセスにおいてレコード・ロックの理解を深めるためのサンプルを紹介する。
ここで紹介するサンプル RPG は更新用ファイルのレコードを CHAIN 命令によって読み取った
ままで EXFMT
で画面を表示している。
明細画面は次のとおりである。
0001.00 H DFTNAME(RCD001) DATEDIT(*YMD/) 0002.00 F******** レコード・ロック処理の例 ********************************** 0003.00 FRCD001FM CF E WORKSTN 0004.00 FSHOHIN UF A E K DISK 0005.00 F********************************************************************** 0006.00 D SAVDTA S 1 DIM(1024) 0007.00 D SAVEDS E DS EXTNAME(SHOHIN) 0008.00 C*----------------------------------------------------+ 0009.00 C START TAG 0010.00 C EXFMT DSPHEAD 0011.00 C*----------------------------------------------------+ 0012.00 C SETOFF 919299 0013.00 C*( CF03 )- 終了 0014.00 C 03 SETON LR 0015.00 C LR RETURN 0016.00 C *NOKEY CLEAR SHOHINR 0017.00 C SETOFF 90 0018.00 C SHCODE CHAIN SHOHIN 90 0019.00 C N90 MOVEA SAVEDS SAVDTA 0020.00 C*----------------------------------------------------+ 0021.00 C DSPLY TAG 0022.00 C EXFMT DSPDTA01 0023.00 C*----------------------------------------------------+ 0024.00 C SETOFF 919299 0025.00 C*( CF03 )- 終了 0026.00 C 03 SETON LR 0027.00 C LR RETURN 0028.00 C*-( CF12 )- 前画面 0029.00 C *IN12 IFEQ *ON 0030.00 C UNLOCK SHOHIN 90 0031.00 C GOTO START 0032.00 C END 0033.00 C MOVEA SAVDTA SAVEDS 0034.00 C*----------------------------------------------------+ 0035.00 C 90 WRITE SHOHINR 0036.00 C N90 UPDATE SHOHINR 0037.00 C*----------------------------------------------------+ 0038.00 C GOTO DSPLY 0039.00 C END TAG
商品マスター SHOHIN は
0018.00 C SHCODE CHAIN SHOHIN 90
によってレコードを獲得した状態のままで
0022.00 C EXFMT DSPDTA01
が実行されているので、このユーザーが画面を眺めているあいだはレコードは他の更新ユーザー
からはロックされたままとなる。
つまり同じレコードを他ののユーザーがこのプログラム、または他の更新用のプログラムを使って
同じレコードを更新用としては読み取ることはできない。
このユーザーが実行キーを押してレコードを更新するか、または F12キーを押して初期画面に
戻るまでは他の同じレコードを要求したユーザーは待ちの状態となる。
待ち時間は物理ファィルの作成 : CRTPF
コマンドで指定されている、「最大レコード待機時間」
であり通常の初期値は 60秒、つまり1分である。
この「最大レコード待機時間」を *NOMAX
で作成する開発者もいるが、待たされるユーザーは
エラーでは終了しないものの、永続的に原因不明で待たされることになるのでお奨めはできない。
次に F12キーによる処理であるが、
0028.00 C*-( CF12 )- 前画面 0029.00 C *IN12 IFEQ *ON 0030.00 C UNLOCK SHOHIN 90 0031.00 C GOTO START 0032.00 C END
のように UNLOCK
命令によってレコード・ロックを解除していることに注意されたい。
逆にレコード・ロックを行いたくないのであれば CHAIN 命令を
0018.00 C SHCODE CHAIN(N) SHOHIN 90
のようにすればよい。
レコード・ロックを理解していないと不用意なレコード・ロックによって、運用時にユーザーから
クレームを受け取ることにもなりかねない。
更新用のファイルの読み取りにはレコードがロックされることに注意が必要である。