最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

3.12.CPYFでロックがかかる?

[ Previous ] [ HOME ] [ Upper ] [ Next ]


有るプログラムで、何ヶ月かに一度、RPGで、エラーを起こすものがありました。それは、対話型のプログラムですが、RPGが暗黙の更新オープンをしているときに、xxODRMPというファイルの割り振りエラーなのです。そこでいろいろ調べているうちに、別のジョブで、全く同じ時間(まあ1秒くらいの差がありましたが)で、CPYFをしている事に気づきました。

  桁 . . . . . :    1  71          走査検索                      
 SEU==>                                                                PSC110CL 
0274.00  /*--------------------------------------------------*/                 
0275.00  /*                                                  */                 
0276.00  /* QTEMPから本番データライブラリーにデータ複写 */                 
0277.00  /*                                                  */                 
0278.00  /*--------------------------------------------------*/                 
0279.00                                                                         
0280.00              PSSTS      USER(1) TYPE(APL) DATAID(&PIDTID) +             
0281.00                           VER(&PIPGVR) STS('DCASDBF に複写 ') +         
0282.00                           PGM(PSC110CL)                                 
0283.00                                                                         
0284.00   CPYF  QTEMP/xxODRMP &DBLIB/xxODRMP  MBROPT(*ADD)                      
0285.00                                                      
0286.00                                                                         
0287.00  /*------------------------------------------------------------*/       
0288.00  /*                                                            */       
0289.00  /*  受信データのプルーフリスト作成                            */       
0290.00  /*                                                            */       
0291.00  /*------------------------------------------------------------*/       
0292.00                                                                         
0293.00              PSSTS      USER(1) TYPE(APL) DATAID(&PIDTID) +             
0294.00                           VER(&PIPGVR) STS(' 明細 スプール 作成 ') +       
                                                                                          

CPYFをしているプログラムでは、エラーになっていません。これが原因かなぁ、でも変です。*REPLACEなら、メンバーのRMVMをするはずなので、ロックするのは分かります。でも、*ADDなのになぁ。そこで調べてみました。

まずは、アロック(割り振り)に関してのおさらいです。

CL(制御言語)プログラミングバージョン 3資料番号 SC88-5498-00

4.16 資源の割振り

オブジェクトは、その使用目的(読取りまたは更新)、および共用(複数のジョブによる同時使用)が可能かどうかに基づいて割り振られます。ファイルおよびメンバーは必ず *SHRRD で割り振られ、ファイル・データはロック状態で指定されたロック・レベルで割り振られます。ロック状態とは、オブジェクトの用途、およびそのオブジェクトが共用されるかどうかを識別するものです。ロック状態には、次の5 種類があります(パラメーター値をかっこに入れて示してあります)。

  • 占有 (*EXCL)

    オブジェクトは要求もとジョブの占有使用として確保され、他のジョブはこのオブジェクトを使用することができません。ただし、オブジェクトがすでに別のジョブに割り振られている場合には、他のジョブはそのオブジェクトを占有使用することはできません。実行している機能が完了するまで他のユーザーがオブジェクトにアクセスできないようにしたい場合には、このロック状態が必要です。

  • 読取り可占有 (*EXCLRD)

    オブジェクトはそれを要求したジョブに割り振られますが、他のジョブからもそのオブジェクトを読み取ることができます。他のユーザーがオブジェクトに対して読取り以外の操作を行うことができないようにしたい場合には、このロック状態が必要です。

  • 更新共用 (*SHRUPD)

    オブジェクトは、更新についても読取りについても、別のジョブとの共用が可能です。すなわち、別のユーザーが、同じオブジェクトに対して読取り共用ロック状態または更新共用ロック状態のいずれかを要求することができます。オブジェクトを変更する処理で、他のユーザーによる同じオブジェクトの読取りまたは変更を可能にしたい場合には、このロック状態が適切です。

  • 更新不可共用 (*SHRNUP)

    ジョブが、更新不可共用ロック状態または読取り共用ロック状態を要求した場合には、そのオブジェクトを別のジョブと共用することができます。オブジェクトを変更する処理で、他のユーザーによるそのオブジェクトの変更をできないようにしたい場合には、このロック状態が必要です。

  • 読取り共用 (*SHRRD)

    ユーザーがオブジェクトの占有使用を要求していなければ、オブジェクトは別のジョブと共用することができます。すなわち、別のユーザーは、そのオブジェクトに対して読取り可占有、更新共用、読取り共用、または更新不可共用の各ロック状態を要求することができます。

注: ライブラリーの割振りは、そのライブラリー内のオブジェクトに対して実行できる操作を制限するものではありません。すなわち、あるジョブによりライブラリーが読取り可占有ロック状態または更新共用ロック状態になった場合には、他のジョブはそのライブラリーにオブジェクトを入れたり、そのライブラリーからオブジェクトを除去したりすることはできません。ただし、この場合でも他のジョブはライブラリー内のオブジェクトを更新することができます。

次の表は、オブジェクトに対する有効なロック状態の組合せを示しています。

表  4-5. 有効なロック状態の組合せ
あるジョブのロック状態 他のジョブが取り得るロック状態
*EXCL なし
*EXCLRD *SHRRD
*SHRUPD *SHRUPD または *SHRRD
*SHRNUP *SHRNUP または *SHRRD
*SHRRD *EXCLRD、*SHRUPD、*SHRNUP、または *SHRRD

 

基本的に、OS400の上で何か作業をすれば、原則的に、参照されたオブジェクトは何かしらロックされると思った方がいいですね。大抵、*SHRRDです。これが一番弱いロックです。最強のロックは*EXCLです。*SHRRDは、*EXCL以外すべてで使えます。*SHRUPD同士、*SHRNUP同士はエラーになりません。*SHRNUPを有るジョブが取ると、*SHRUPD出来ないので、更新できない仕組みです。逆もそうですね。ま、早いもの勝ちです。これらのロック状態は、お互いにお互いの立場をわきまえるために存在しているだけです。すべてOKな*SHRRDなんて要らないじゃないか、と思うかもしれませんが、*EXCLがそれをはじき、*EXCLRDは、それを受け入れるので、*SHRRDの存在が必要なのですね。

次に、RPGが、更新オープンしたファイルのロックはどうなるのか調べました。

RPG/400 使用者の手引き 資料番号 SC88-5203-00

5.5 RPG/400 プログラムによるファイルのロック

OS/400 システムでは、ジョブ中に使用するファイルを、ロック状態(占有、読取り可占有、更新共用、更新不可共用、または読取り共用)にすることができます。ジョブ内のプログラムは、ファイルのロック状態によって影響は受けません。ファイルのロック状態は、別のジョブ内のプログラムでファイルを同時に使おうとした場合にのみ適用されます。ファイルのロック状態は CL コマンド ALCOBJ (オブジェクト割振り)によって、割り振ることができます。資源の割振りおよびロック状態の詳細については データ管理機能の手引き を参照してください。

OS/400 システムでは、データベース・ファイルのオープン時に、以下のロック状態が設定されます。

ファイル・タイプ ロック状態
入力 読取り共用
更新 更新共用
追加 更新共用
出力 更新共用

読取り共用のロック状態では、別のユーザーは、読取り共用、更新共用、更新不可共用、または読取り可占有のロック状態でファイルをオープンすることはできますが、ファイルを占有して使用するように指定することはできません。更新共用のロック状態の場合には、他のユーザーは読取り共用または更新共用のロック状態でこのファイルをオープンすることができます。

RPG/400 プログラムでは装置ファイルに対して、読取り可占有のロック状態が設定されます。他のユーザーはこのファイルを読取り共用のロック状態でオープンすることができます。

RPG/400 プログラムによって設定されたロック状態は、オブジェクト割振りコマンドを使用して変更することができます。

これで、更新の時に、エラーが起きるとすれば、相手は、*EXCLか、*EXCLRDか、*SHRNUPとなりますよね。

CPYFに関して調べてみました。

AS/400 アドバンスト・シリーズ データ管理バージョン 3 資料番号 SC88-5494-00

4.13 割振りに関する考慮事項

データベース・ファイルのコピー時には、各コピー元ファイル・メンバーに読取り共用 (*SHRRD) ロック状態が割り振られます。メンバーにこの割振りがなされるのは、それがコピー中だけに限られます。装置ファイルのコピー時には、その装置ファイルに読取り共用 (*SHRRD) ロック状態が割り振られます。一般的に、コピー先になるメンバーには更新共用 (*SHRUPD) ロック状態が割り振られます。ただし、MBROPT(*REPLACE) が指定されている場合は、コピー先になるメンバーには占有(*EXCL) ロック状態が割り振られ、コピー先になるファイルの中のレコードは削除されます。読取り共用ロック状態では、他のユーザーにコピー中のファイルの読取りおよび更新をさせます。

物理ファイルから別の物理ファイルにコピーするときは、次のようにより強力なロックをメンバーに施して、内部システム機能でコピーを実行することができるようにすることもあります 。

    コピー元ファイル・メンバーには、読取り可占有 (*EXCLDRD) ロック状態を割り振ることができます。
    コピー先ファイル・メンバーには、占有 (*EXCL) ロック状態を割り振ることができます。

COMPRESS(*NO) が指定されている場合は、より強力なロックが必要とされます。より強力なロックが得られない場合は、代わりに COMPRESS(*YES) を指定して、コピー操作を実行することもできます。

あるメンバーに、別のジョブにより強力すぎるロック状態が割り振られた場合、またはファイルを含むライブラリーがコピー操作中に名前変更された場合は、エラー・メッセージが出されてコピー操作は打ち切られることになります。

コピー・コマンドの要求の実行過程で、TOFILE パラメーターで指定したファイルが、アクセスできないようにロックされる(タイムアウトのない *EXCL ロックと同様のロック)ことがあります。TOFILE で指定したオブジェクトを使用しなければならない機能を使用しようとすると、そのコピー・コマンドの実行が完了するまで、そのワークステーションのロックアップが起こります。以下に示すのは、コピー・コマンドによるコピーが進行中のコピー先ファイルに対して使用してはならない機能の例です。

WRKACTJOB
 オプション 11(ロックの作業)
 オプション 5 (ジョブ・メンバー・ロックの作業)
 オプション 8 (オブジェクト・ロックの作業)

DSPDBR
DSPFD
DSPFFD
WRKJOB
 オプション 12(活動状態のロックの作業)
 オプション 5 (ジョブ・メンバー・ロックの作業)
 F10(活動中のオープン・ファイルの表示)

WRKLIB
 コピー先ファイルが入っているライブラリー

DSPLIB
 コピー先ファイルが入っているライブラリー

WRKOBJLCK
WRKRCDLCK

コピー・コマンドによるデータのコピーが進行中のコピー先ファイルに関する何らかの情報を表示したい場合は、その要件をあらかじめ予想し、ERRLVL(1) を指定することによりコピー・コマンドにブロック・レコード単位の操作を強制的に使用させるようにしなければなりません。

このために問題の発生があらかじめ予想される場合は、オブジェクト割振り(ALCOBJ) コマンドを使用して、ファイルおよびメンバーを事前割振りすることができます。(オブジェクトの事前割振りについては、CL(制御言語)プログラミング (SC88-5498) を参照してください。)

コピー・コマンドによるコピーが進行中のコピー先ファイルに対して使用してはならない機能の例、なんて皆さんご存知でしたか?コピー中はいつもWRKOBJLCKしてはいけないのだろうか?まあ、今回の調査目的は、コピー側のエラーではなくて、コピー先のファイルが、RPGの更新オープンでエラーになったわけで、関係ないですけど。

CL(制御言語)解説書 バージョン3 資料番号 SC88-5499-00

1.6.30 CPYF(ファイル・コピー)コマンド

制約条件:

1. CPYF 要求の実行中、TOFILE パラメーターで指定したファイルはロックされ、アクセス不可能になる場合があります(タイムアウトのない*EXCL と類似しています)。

....

多分、上と同じ事を言ってますね。BTW (By the way)、MBROPT(*UPDADD)って使ったこと無かった。

結論

自分は正しいことをしていると思うのです。RPGの更新オープン=*SHRUPDで、CPYFの*ADDならば、同じく*SHRUPDです。この場合、エラーは起きないはずなのですが...2番目に出ていた、物理ファイルから別の物理ファイルにコピーするときは、次のようにより強力なロックをメンバーに施して、内部システム機能でコピーを実行することができるようにすることもあります 。ってどういう場合なのでしょう?論理ファイルなら良かったのでしょうか?結局、よく分からないまま、このページは終わりです。気分悪いなぁ。

以上

1999/8/28


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

Ads by TOK2