COBOL2002 ユーザーズガイド


7.2.2 レコードレベルのファイル共用

〈この項の構成〉

(1) ファイルの開き方による相違

INPUTモードで開かれたファイルは共用できますが,ファイルのレコードは施錠できません。I-OまたはEXTENDモードで開かれたファイルは共用できます。

ファイルをEXTENDモードで開いている間に,ほかのファイル単位がINPUTまたはI-Oモードで同じファイルを開いた場合,完全な論理ファイル(EXTENDモードで追加したレコードを含めた論理ファイル)のレコードを読み込めます。しかし,EXTENDモードで開かれたほかの実行単位については,レコード施錠によってレコードの出力を防げません。

INPUTモードで開かれた共用ファイルは,ほかのファイル単位からのレコードの参照,更新を防げません。ファイルをEXTENDモードで開いている間に,ほかのファイル単位がINPUTまたはI-Oモードで開いてレコードを読み込もうとした場合,EXTENDモードで出力されたレコードについては,読み込みが保証されます。ただし,LOCK MODE句の指定のないINPUTモードの場合,読み込みは保証しません。

ほかのファイル単位がEXTENDモードで開かれた場合に,双方に追加されるレコードの内容については,マニュアル「COBOL2002 言語 拡張仕様編」 「3 ファイル共用機能」を参照してください。

(2) レコード施錠

単一のレコードを施錠する場合と複数のレコードを施錠する場合についてそれぞれ説明します。

(a) 単一レコード施錠

単一レコード施錠を指定した実行単位は,一つのファイル内に一つだけのレコード施錠を取得できます。

単一レコード施錠では,レコード施錠の解放をUNLOCK文で指定できます。また,新しいレコードを施錠すると,それまでのレコード施錠は自動的に解放されます。同じ実行単位でレコード施錠が解放される条件を次に示します。

  • START文以外の入出力文が成功したとき

  • ファイルを閉じたとき

START文ではレコード施錠は解放されません。また,レコード施錠の取得,解放に失敗したとき,レコード施錠の状態は保証しません。

次に,単一レコード施錠の例を示します。

[図データ]

  1. プログラムXが,共用モードでファイル'MASTER1'を開きます。

  2. READ文が実行されると,1番目のレコードが施錠されます。

  3. 次のREAD文が実行されると,1番目のレコードの施錠が解除され,2番目のレコードが施錠されます。

  4. プログラムYが,共用モードでファイル'MASTER1'を開きます。

  5. READ文が実行されると,1番目のレコードが施錠されます。

  6. READ文が実行されますが,2番目のレコードはプログラムXによって施錠されているため,READ文は失敗します。

(b) 複数レコード施錠

複数レコード施錠を指定した実行単位は,一つのファイルに複数のレコード施錠を同時に取得できます。施錠されたレコードはほかの実行単位から使用できませんが,施錠されていないレコードは使用できます。

複数レコード施錠は,相対または索引ファイルにだけ使用できます。相対ファイルの場合,施錠できるレコード数に限りがあり,このレコード数は環境変数CBL_RECLOCKMAXで指定します。

形式
CBL_RECLOCKMAX=レコード数
  • 「レコード数」には施錠したいレコード数を指定します。指定できる値は0〜999,999,999です。なお,指定した値に比例してメモリが消費されますので,実レコード数に見合った値を指定してください。

  • この環境変数を指定していない場合,および「0」を指定した場合は,「50」が仮定されます。

  • この環境変数に指定した値よりも多くのレコード施錠を要求した場合は実行時エラーとなります。

複数レコード施錠は,LOCK MODE句にMANUALを指定し,WITH LOCK指定のREAD文を実行するごとにレコード単位で取得できます。WITH LOCK指定のないREAD文を実行した場合,レコード施錠は取得されません。このときでも,取得済みのレコード施錠は解放されません。

同じ実行単位でレコード施錠が解放される条件は次のとおりです。

  • ファイルに対してUNLOCK文を実行したとき

  • ファイルを閉じたとき

レコード施錠の取得,解放に失敗したとき,レコード施錠の状態は保証しません。

また,COBOL入出力サービスルーチンで作成した相対ファイルでも,複数レコード施錠を使用できます。