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文ではレコード施錠は解放されません。また,レコード施錠の取得,解放に失敗したとき,レコード施錠の状態は保証しません。
次に,単一レコード施錠の例を示します。
-
プログラムXが,共用モードでファイル'MASTER1'を開きます。
-
READ文が実行されると,1番目のレコードが施錠されます。
-
次のREAD文が実行されると,1番目のレコードの施錠が解除され,2番目のレコードが施錠されます。
-
プログラムYが,共用モードでファイル'MASTER1'を開きます。
-
READ文が実行されると,1番目のレコードが施錠されます。
-
READ文が実行されますが,2番目のレコードはプログラムXによって施錠されているため,READ文は失敗します。
(b) 複数レコード施錠
複数レコード施錠を指定した実行単位は,一つのファイルに複数のレコード施錠を同時に取得できます。施錠されたレコードはほかの実行単位から使用できませんが,施錠されていないレコードは使用できます。
複数レコード施錠は,相対または索引ファイルにだけ使用できます。
複数レコード施錠は,LOCK MODE句にMANUALを指定し,WITH LOCK指定のREAD文を実行するごとにレコード単位で取得できます。WITH LOCK指定のないREAD文を実行した場合,レコード施錠は取得されません。このときでも,取得済みのレコード施錠は解放されません。
同じ実行単位でレコード施錠が解放される条件は次のとおりです。
-
ファイルに対してUNLOCK文を実行したとき
-
ファイルを閉じたとき
レコード施錠の取得,解放に失敗したとき,レコード施錠の状態は保証しません。
また,COBOL入出力サービスルーチンで作成した相対ファイルでも,複数レコード施錠を使用できます。