9 章 ファイルの共用と排他制御の機能
従来の COBOL では、同時に動作する複数のプログラムから、同じのファイルを操作することができませんでした。
COBOL2002 では、ファイル定義単位にファイル共用及び排他制御という新たに導入された機能によって、同時に動作する複数のプログラムから同じファイルを操作することが可能になります。
本機能を利用することで、同時に動作する複数のプログラムから同一ファァイルにアクセスする際、ファイル単位やレコード単位でのアクセスについてデータの保全性を高めることが可能となります。

9.1 ファイル共用とレコードロック
ファイル共用とは、複数のプログラムからの同一ファイルへのアクセスを制御する機能です。ファイル共有は、「排他モード」と「共用モード」の２種類に大別されます。
レコードロックとは、共用モードでアクセスされるファイル上のレコードについて、複数のプログラムからレコードの排他制御を行う機能です。
これらの機能を使うことにより、１つのプログラムでのみファイルアクセスを許す（排他モード）業務プログラムの開発や、同時に複数のプログラムで１つのファイルの共用（共用モード）を行う業務プログラムの開発が可能となります。

9.1.1

ファイル共用

ファイル共用とは、同時に動作する複数のプログラムから同一ファイルへのアクセスを制御するものです。ファイル共用のモードには、「共用モード」、「読込み専用共用モード」、及び「排他モード」の３種のモードがあります。

「共用モード」とは、同時に動作する複数のプログラムからファイルをアクセスする際に、各々のプログラムの OPEN モードとして INPUT モード、I‑O モード、EXTEND モードの組合わせで共用できるモードです。

「読込み専用共用モード」とは、同時に動作する複数プログラムからファイルをアクセスする際に、OPEN モードとして INPUT モードの場合に限って共用して使用できるモードです。

「排他モード」とは、１つのプログラムでアクセス中は、他のプログラムとの共用を行わCOPYRIGHT

2001

COBOL コンソーシアム

1

ないモードです。一旦 OPEN を行うと CLOSE するまでの間、「ファイル共用矛盾」により他のプログラムからのアクセスを拒否されます。

共用ファイルへのアクセスは、共用モードと OPEN モードの組み合わせが正しく、かつ、別プログラムからの同一ファイルに関連するファイル定義との組み合わせにおいても、ファイル共用が許された記述でなければなりません。

9.1.2

レコードロック

レコードロック（record locking）とは、同時に動作する複数のプログラムより、同一ファイルの同一レコードへのアクセスを制御する機能です。レコードロック機能は、共用モードでのアクセスが許されたファイルに対してのみ適用可能です。ある入出力文によってあるレコードを参照すると、そのレコードはロックされ、他のプログラムからそのレコードへのアクセスは IGNORING LOCK 指定のある READ 文によるアクセスを除いて、「レコード共用矛盾」が発生してアクセスが拒否されます。
レコードロックを行うには、各々の入出力文でレコードのロック管理を意識することなく行う「自動ロック」、及び各々の入出力文で意識的にレコードのロック管理を行う「手動ロック」の２種類があります。

「自動ロック」は、READ 文が実行された場合、読込んだレコードに対して自動的にレコードロックが行われます。

「手動ロック」は、明示的に LOCK 指定が書かれた入出力文が実行された場合、処理対象となるレコードに対してレコードロックが行われます。

また、同時に保持できる最大レコードロック数の管理方式には、「単一レコードロック」と「複数レコードロック」の２種類があります。

「単一レコードロック」は、１つのファイル定義中でロック可能なレコードは唯一つになります。 例えば、READ 文の実行が成功した場合に読込んだレコードにレコードロックが行われ、以前の READ 文でロックされていたレコードは自動的に解放されます。

「複数レコードロック」は、１つのファイル定義中で複数個のレコードがロック可能です。
例えば、READ 文の実行が成功した場合に読込んだレコードにレコードロックが行われても、以前の READ 文で既にロックされているレコードも解放されずにレコードロックされたままとなります。

COPYRIGHT

2001

COBOL コンソーシアム2

9.2 SHARING によるファイル共用の指定
ファイル共用はファイル管理記述項の SHARING 句、又は SHARING 指定のある OPEN
文で指定します。両方の指定がある場合は OPEN 文の指定を優先します。指定可能なファイル共用には、次の３種類があります。
ALL OTHERSHARING WITHNO OTHERREAD ONLY（１）NO OTHER は「排他モード」を表し、ファイルへのアクセスが排他的であることを指定します。指定したファイルが、他のプログラムにより開かれている場合、指定したファイルの OPEN は不成功となります。あるプログラムによって OPEN が成功した場合、CLOSE されるまでの間、他のプログラムによって OPEN することができません。NOOTHER では、レコードロックは有効となりません。

（２）READ ONLY は「読取り専用モード」を表し、指定したファイルへのアクセスが他のプログラムとの同時アクセスを入力モードのみに制限します。他のプログラムで入力以外のモードで開かれている場合、指定したファイルの OPEN は不成功となります。指定したファイルの OPEN が成功した場合、他のプログラムからは、入力でないモードでは OPEN することができません。READ ONLY では、レコードロックは有効となります。

（３）ALL OTHER は「他の全てとの共用モード」を表し、指定したファイルへのアクセスが入力モード、入出力モード、又は拡張モードの場合において、同じ OPEN モードを指定した他のプログラムで、ファイル共用の制限事項に従って同時アクセスを許可するものです。ALL OTHER では、レコードロックは有効となります。

以上のように、ファイル共用は先行の実行単位により既に OPEN されたファイルに対して、後行の実行単位で同一ファイルに OPEN を実行した場合、組み合わせによって OPENが成功したり不成功となったりします。ファイル共用モードの組み合わせにより、OPEN
文が成功するか否かを次の表に示します。

COPYRIGHT

2001

COBOL コンソーシアム

3後行 OPEN 要求

READ
ONLY

ALL
OTHER

READ ONLYALL OTHER

EXTENDI‑O
INPUT
OUTPUT
不成功

EXTENDI‑O
OUTPUT

INPUT

EXTENDI‑O
OUTPUT

INPUT

不成功

不成功

不成功

不成功

不成功

不成功

不成功

不成功

不成功

不成功

不成功

OUTPUT
EXTEND
I‑O
INPUT

不成功
不成功

不成功
不成功正常
OPEN
不成功
不成功

不成功

OUTPUT

不成功正常
OPEN
不成功正常
OPEN
不成功正常
OPEN正常OPEN
不成功正常OPEN
正常
OPEN
不成功

先行 OPEN 要求
NO
OTHER

NO
OTHER

EXTENDI‑O
INPUT
OUTPUT
EXTEND
I‑O
INPUT

不成功
正常OPEN正常
OPEN
不成功

9.3 LOCK 句によるレコードロックの指定
レコードロックの方式はファイル管理記述項の LOCK 句で指定します。

LOCK MODE IS

MANUAL
AUTOMATICRECORD

WITH LOCK ON

1.

MULTIPLE

RECORDSMANUAL 指定があるとロックモードは手動になり、LOCK 指定が入出力文に明示的に指定されている場合に限り、レコードはロックされます。

2.

AUTOMATIC 指定があるとロックモードは自動になり、次の場合にレコードはロックされます。
（ａ）IGNORING 指定も NOLOCK 指定もない READ 文が実行された場合（ｂ）LOCK 指定のある REWRITE 文は WRIT E 文が実行された場合

COPYRIGHT

2001

COBOL コンソーシアム

43.

MULTIPLE 指定がない場合、単一レコードロックとなります。単一レコードロックの場合、ある時点に１つのファイル定義でロックできるレコードは唯ひとつに限られます。レコードをロックしたある文の実行が成功すると、そのファイル定義に対してそれ以前にロックされた、そのファイル中のあらゆるレコードロックが解放されます。

4.

MULTIPLE 指定がある場合、複数レコードロックとなります。複数レコードロックの場合、１つのファイル定義でロックされたレコードを１つ以上保持することができます。

9.4 RETRY 指定 による繰返し排他制御の指定
RETRY 指定は、ファイル又はレコードが既にロックされた状態であっても、排他制御を続けるかを指定します。他のプログラムによって既にロックされたファイル又はレコードにアクセスする場合は「ファイル共用矛盾」又は「レコード共用矛盾」が発生するため、通常プログラムにより繰返しアクセスを行います。RETRY 指定は、共用矛盾が発生したファイル又はレコードに対して繰返しアクセスを自動的に行い、プログラムの処理を軽減します。
自動的な繰返し処理の指定方法には、「再試行回数」の指定、「処理中断時間」の指定、「無条件繰返し」の指定の３種類があります。
算術式 1 TIMESRETRYFOR 算術式 2 SECONDSFOREVER1.

算術式 1 は、ロックされている資源のアクセスに失敗してから、入出力操作の要求を完了させるまでの再試行回数を指定します。

2.

算術式 2 は、ロックされている資源のアクセスに失敗してから、処理中断期間の秒数を指定します。処理中断の期間中、ロックされている資源のアクセス権を獲得する試みが繰り返されます。

3.

FOREVER 指定は、ロックされている資源のアクセス権を獲得する試みを、入出力操作が完了するまで繰り返します。

4.

入出力操作の最初の試みが不成功となった理由がファイル共用矛盾又はレコード共用矛盾である場合、次を適用します。
（ａ）RETRY 指定がない場合、あるいは算術式 1 や算術式 2 の評価の結果が有効でない値の場合、この文は不成功に終わり、ファイル共用矛盾やレコード共用矛盾が発生します。

COPYRIGHT

2001

COBOL コンソーシアム

5

（ｂ）1 〜3 の規定通り入出力操作を完了させようして成功した場合には入出力操作文は成功に終わりますが、失敗した場合にはファイル共用矛盾又はレコード共用矛盾が発生します。

9.5 記述例
IDENTIFICATION DIVISION.
PROGRAM‑ID. SAMPLE.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
INPUT‑OUPUT SECTION.
FILE‑CONTROL.
SELECT USER‑FILE ASSIGN TO SYS000
ORGANIZ ATION IS SEQUENTIALSHARING WITH ALL OTHER ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ①
LOCK MODE IS AUTOMATIC WITH LOCK ON RECORD. ･ ･ ･ ･ ･ ･ ②
DATA DIVISION.
FILE SECTION.
FD USER‑FILE.
01 USER‑REC PIC X(10).
PROCEDURE DIVISION.
OPEN I‑O USER‑FILE.
READ USER‑FILE RETRY FOREVER ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ③
MOVE ALL ‘X’ TO USER‑REC.
REWRITE USER‑REC. ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ･ ④
CLOSE USER‑FILE.
STOP RUN.
①「他の全てとの共用モード」で OPEN を行います。制限事項に従う限りにおいて、他ファイル結合子との同時アクセスが許可されます。
②単一レコードロックを自動的に行います。つまり、このファイル中のレコードに対する READ 文で自動的にレコードロックを行い、以前の READ 文で獲得したレコードロックを自動的に解放します。
③レコードロックありで１レコードを読み込みます。但し、他のプログラムによってレコードロックされている場合においても、レコードロックが確保できるまで引き続き READ 文は実行されます。この READ 文の実行が成功するとレコードはロックされ、他のプログラムからのアクセスをレコード共用矛盾により拒否します。
④③で読み込んだレコードを更新します。REWRITE 文が終了すると、③で確保したレコードロックは解放されます。

COPYRIGHT

2001

COBOL コンソーシアム

6