RPG

341. RPG のレコード・ロック

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プログラマーは意外とこのことに気づいていない人が多いかも知れないので
あえて外れるケースも紹介した。