前ページへファイル状態 ファイルハンドラの構成次ページへ

第 5 章 ファイルの共有

マルチユーザ環境でデータを共有する場合は、複数のユーザが同じデータを同時に変更できないようにする必要があります。 ファイルやレコードをロックすると、データの完全性を維持しながら、マルチユーザ環境のプログラムで共通ファイルを共有することができます。

5.1 共有モード

共有モードは、特定のファイルについてファイルの共有とレコードのロックを行う場合に指定します。

共有モードには 3 種類あります。

各共有モードでのファイルオープン操作結果を示す詳細な表については、『言語リファレンス』の『手続き部 - MERGE - OPEN』の章にある『別のファイルコネクタで現在開いている利用可能な共有ファイルを開く』を参照してください。

これらの共有モードを指定するには、OPEN 文で、または、SELECT句の一部として語句 SHARING を使用します。OPEN 文で語句 SHARING を使用すると、SELECT句の語句 SHARING は無効になります。

SELECT句または OPEN 文のどちらにも語句 SHARING を指定しない場合は、共有モードが、次のどれかの条件が最初に満たされるときに決定されます。

5.2 出力ファイルのオープン

COBOL の OPEN OUTPUT 文は、システムの操作には 2 つの呼び出しが必要です。1 つはファイルをオープンするため、2 つ目は排他ロックを取得するためです。つまり、2 つの呼び出しの間に短時間ですが時間が経過し、ファイルの作成と排他ロックがかけられる間に、別のユーザが同じファイルにアクセスする可能性があります。こうした場合、別のユーザが開いたファイルは空であり、読み取ろうとすると「at end (ファイルの終了)」エラーとなります。OPEN OUTPUT を実行しているユーザは、排他ロックの呼び出しが失敗するために、「file locked(ファイルロック)」エラーとなります。

5.3 レコードロック

ファイルの共有が有効である場合、個々のレコードにロックを設定することができます。 レコードにロックを設定すると、他のユーザは、ロックされたレコードにアクセスできないため、ロック解除されているレコードにアクセスします。


注: 行順ファイルや入力ファイルとして開いたファイルでは、レコードをロックできません。


5.3.1 手動レコードロックと自動レコードロック

レコードをロックするには、手動または自動のどちらかで行います。

5.2.1.1 手動レコードロック

手動レコードロックを使用する場合、READ 文を使用してレコードロックを取得してください。

手動ロックを使用するには、次のように指定します。

  1. ファイルに対して SELECT句と LOCK MODE IS MANUAL 句を指定します。

  2. READ 文と WITH LOCK 句を指定します。

select fd-name
   assign to "muser.dat"
   lock mode is manual
...
read fd-name with lock

5.3.1.2 自動レコードロック

自動レコードロックを使用する場合、READ 文はレコードロックを自動的に取得します。レコードをロックしない場合は、READ 文で WITH NO LOCK 句を指定してください。

自動ロックを指定するには、ファイルに対して SELECT句と LOCK MODE IS AUTOMATIC 句を使用してください。

select fd-name
   assign to "muser.dat"
   lock mode is automatic
...
read fd-name

5.3.2 単一および複数のレコードロック

ロックするレコード数を、単一または複数のどちらかに指定できます。

5.3.2.1 単一レコードロック

単一レコードロックを使用する場合は、1 回に 1 つのレコードロックのみを保持できます。ファイルで新しく入出力操作を行うたびに、前のロックが解放されます。

単一のレコードロックを指定するには、LOCK MODE IS MANUAL 句、または LOCK MODE IS AUTOMATIC 句の後に、 WITH LOCK ON MULTIPLE RECORDS 句を使用しないようにします。

5.3.2.2 複数レコードロック

複数レコードロックでは、同時に多くのレコードロックを保持できます。

複数レコードロックを指定するには、LOCK MODE IS MANUAL 句または LOCK MODE IS AUTOMATIC 句の後に WITH LOCK ON MULTIPLE RECORDS 句を続けます。例えば、次のようになります。

select fd-name
   assign to "muser.dat"
   lock mode is automatic with lock on multiple records
...

注:


5.3.3 レコードロックの操作

デフォルトでは、読み取り処理中にロックされたレコードを検出すると、レコードロック状態コードを返します。この場合、レコード領域は更新され、レコード内容が表示されます。ただし、現在のレコードポインタはロックされたレコードと関連付けられたままであるため、この操作の後に続く READ NEXT 操作で同じレコードへ再アクセスします。

次の構成オプションは、上記の処理方法に影響します。


注:

ロックされたレコードへのアクセスを省略するために、START…KEY IS GREATER THAN.. 文を使用することもできます。


5.3.4 レコードロックの解放

ロックを取得したプログラムが次のどれかの操作を行うと、すべてのレコードロックが解放されます。

さらに、ロックを取得したプログラムが START 以外のファイル操作でファイルの他のレコードにアクセスした場合は、単一レコードロックが解放されます。

5.4 ファイル状態コード

プログラムをマルチユーザ環境で実行する場合は、次のファイル状態コードを常に確認することが必要です。

9/065 この状態コードは、OPEN 文により返され、ファイルがロックされていることを示します。
9/068 この状態コードは、READ 文、DELETE 文 または REWRITE 文により返され、レコードがロックされていることを示します。
9/213 この状態コードは、最大許容ロック数に達したことを示します。最大許容ロック数は、ネットワークとオペレーティングシステムによって異なります。

5.5 ファイルロックとレコードロックのアプリケーション例

ファイルロックとレコードロックのアプリケーション例が提供されます。この例は、メインプログラムである LOCKING.CBL と、このメインプログラムで呼び出される他のプログラムから構成されます。Infomgr を使用してこのアプリケーション例を検索できます。

このアプリケーションを実行するときには、最初にオプション 4 を使用してファイルを作成します。レコードロックの影響を表示するには、複数のセッションでオプション 23 を使用します。


Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書、ならびに使用されている固有の商標と商品名は国際法で保護されています。

前ページへファイル状態 ファイルハンドラの構成次ページへ