RPGのレコード・ロックについて考える。
更新用としてレコードを読取った場合は最後に読取ったレコードを
排他的にロックして他の更新用のプログラムからは読み取れないように
する。
レコード・ロックがかかった場合は他のプログラムからは
同じレコードをアクセスしようとすると読取りでは読取ることは
できるが更新用として読取ろうとすると排他ロックが解放されるまで
一定の時間の間だけ待たされる。
その時間というのは排他制御しているファイルが作成されたときに
決められている、
最大レコード待機時間(WAITRCD)
である。
CRTPF のこの初期値は 60秒、つまり 1分である。
1分は待機するが1分を経過するとアベンドして異常終了することになる。
このように排他制御する時間はファイル毎に定められている。
次にどのようなときにレコードがロックされるのか見てみよう。
PGM107 部品マスターの登録 変更
日付 2020/03/06
部品コード AD-D15FF 時刻 11:28:12
ユーザー QTR
部品名 超小型アダプター
部品区分 1 (1= 購入品 2= 加工品 )
在庫区分 有 無
基準在庫数 1,000 ( 購入品のみ )
管理単位 KO
担当者コード
メーカー型番
メーカーコード 0001
仕入単価 1,500
手配確定 手配確定 (1= 手配確定 )
図面番号 001-8328-0025-ADD15FF
[解説]
これは部品マスターの登録というプログラムである部品レコードを
更新モードで取り出したところである。
RPGプログラムでは
0001.00 H DFTNAME(PGM107) DATEDIT(*YMD/) 0002.00 F******** 部品マスターの登録 ******************************** : 0004.00 FBUHINM UF A E K DISK : F********************************************************************** : 0057.00 C SETOFF 90 0058.00 C TRNKEY CHAIN BUHINM 90 : 0070.00 C 41 EXFMT DSPDTA01 :
という処理がなされている。
つまり
0004.00 FBUHINM UF A E K DISK
として部品マスター BUHINM を更新モードで定義してオープンして
0058.00 C TRNKEY CHAIN BUHINM 90
で、レコードを取得してから
0070.00 C 41 EXFMT DSPDTA01
で、画面を表示したままであるのでレコードは更新モードで
ロックされているはずである。
他のジョブで
DSPRCDLCK FILE(QTRFIL/BUHINM)
を実行してみると
メンバー・レコード・ロックの表示
システム : Sxxxxxx
ファイル . . . . . . : BUHINM メンバー . . . . . . : BUHINM
ライブラリー . . . : QTRFIL
レコード ロック
番号 ジョブ ユーザー 番号 状況 タイプ
1 QPADEV000C QTR 833815 保留 UPDATE
として確かにレコードはロックされていることがわかる。
それでは READ命令によるSFL表示の場合はどうだろうか?
部課マスターを登録
部課コード から
№ 部課コード 部課名 当月労働時間 時間当賃金
0001 11 役員
0002 12 総務部
0003 21 国内営業
0004 22 貿易部
0005 23 大型映像
0006 30 技術部
0007 50 原価係
0008 51 調達課
0009 52 汎用レン
0010 53 サービス
0011 54 精密研磨
0012 56 組立調整
0013 57 ソフト部
[解説]
これは部課マスター(BUKAM)というファイルを更新モードでオープンして
READ命令で読んでSFLに表示している例である。
やはり
DSPRCDLCK FILE(QTRFIL/BUKAM)
でレコード・ロックを調べてみると
メンバー・レコード・ロックの表示
システム : S
ファイル . . . . . . : BUKAM メンバー . . . . . . : BUKAM
ライブラリー . . . : QTRFIL
レコード ロック
番号 ジョブ ユーザー 番号 状況 タイプ
12 QPADEV000Q QTR 833561 保留 UPDATE
のようにロックされているのだが
さらにロール・アップして
部課マスターを登録
部課コード から
№ 部課コード 部課名 当月労働時間 時間当賃金
0014 58 EG部
0015 59 大型映像
0016 91 製造
0017 92 管理販売
0018 99 その他
の状態にして
DSPRCDLCK FILE(QTRFIL/BUKAM)
でレコード・ロックを調べてみると
メンバー・レコード・ロックの表示
システム : S
ファイル . . . . . . : BUKAM メンバー . . . . . . : BUKAM
ライブラリー . . . : QTRFIL
レコード ロック
番号 ジョブ ユーザー 番号 状況 タイプ
( 指定したメンバーのレコード・ロックは見つからない。 )
のようにレコード・ロックは外れていることがわかる。
これは READ命令でEOF、つまりレコードの読取りの終わりに達したために
レコード・ロックが外れたのである。
RPGプログラマーは意外とこのことに気づいていない人が多いかも知れないので
あえて外れるケースも紹介した。