![]() | ファイル状態 | ファイルハンドラの構成 | ![]() |
マルチユーザ環境でデータを共有する場合は、複数のユーザが同じデータを同時に変更できないようにする必要があります。 ファイルやレコードをロックすると、データの完全性を維持しながら、マルチユーザ環境のプログラムで共通ファイルを共有することができます。
共有モードは、特定のファイルについてファイルの共有とレコードのロックを行う場合に指定します。
共有モードには 3 種類あります。
このモードを設定したファイルを他のユーザと共有することはできません。
ファイルを入力ファイルとして開く場合に、他のユーザとの共有が可能です。
他のすべてのユーザとの共有が可能です。
各共有モードでのファイルオープン操作結果を示す詳細な表については、『言語リファレンス』の『手続き部 - MERGE - OPEN』の章にある『別のファイルコネクタで現在開いている利用可能な共有ファイルを開く』を参照してください。
これらの共有モードを指定するには、OPEN 文で、または、SELECT句の一部として語句 SHARING を使用します。OPEN 文で語句 SHARING を使用すると、SELECT句の語句 SHARING は無効になります。
SELECT句または OPEN 文のどちらにも語句 SHARING を指定しない場合は、共有モードが、次のどれかの条件が最初に満たされるときに決定されます。
COBOL の OPEN OUTPUT 文は、システムの操作には 2 つの呼び出しが必要です。1 つはファイルをオープンするため、2 つ目は排他ロックを取得するためです。つまり、2 つの呼び出しの間に短時間ですが時間が経過し、ファイルの作成と排他ロックがかけられる間に、別のユーザが同じファイルにアクセスする可能性があります。こうした場合、別のユーザが開いたファイルは空であり、読み取ろうとすると「at end (ファイルの終了)」エラーとなります。OPEN OUTPUT を実行しているユーザは、排他ロックの呼び出しが失敗するために、「file locked(ファイルロック)」エラーとなります。
ファイルの共有が有効である場合、個々のレコードにロックを設定することができます。 レコードにロックを設定すると、他のユーザは、ロックされたレコードにアクセスできないため、ロック解除されているレコードにアクセスします。
注: 行順ファイルや入力ファイルとして開いたファイルでは、レコードをロックできません。
レコードをロックするには、手動または自動のどちらかで行います。
手動レコードロックを使用する場合、READ 文を使用してレコードロックを取得してください。
手動ロックを使用するには、次のように指定します。
例
select fd-name assign to "muser.dat" lock mode is manual ... read fd-name with lock
自動レコードロックを使用する場合、READ 文はレコードロックを自動的に取得します。レコードをロックしない場合は、READ 文で WITH NO LOCK 句を指定してください。
自動ロックを指定するには、ファイルに対して SELECT句と LOCK MODE IS AUTOMATIC 句を使用してください。
select fd-name assign to "muser.dat" lock mode is automatic ... read fd-name
ロックするレコード数を、単一または複数のどちらかに指定できます。
単一レコードロックを使用する場合は、1 回に 1 つのレコードロックのみを保持できます。ファイルで新しく入出力操作を行うたびに、前のロックが解放されます。
単一のレコードロックを指定するには、LOCK MODE IS MANUAL 句、または LOCK MODE IS AUTOMATIC 句の後に、 WITH LOCK ON MULTIPLE RECORDS 句を使用しないようにします。
複数レコードロックでは、同時に多くのレコードロックを保持できます。
複数レコードロックを指定するには、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 ...
注:
デフォルトでは、読み取り処理中にロックされたレコードを検出すると、レコードロック状態コードを返します。この場合、レコード領域は更新され、レコード内容が表示されます。ただし、現在のレコードポインタはロックされたレコードと関連付けられたままであるため、この操作の後に続く READ NEXT 操作で同じレコードへ再アクセスします。
次の構成オプションは、上記の処理方法に影響します。
これを ON に設定すると、入力用に開いたファイルを読み取るときにレコードロックを無視します。
これを ON に設定すると、ロックされたレコードへのアクセス処理が成功するまで再試行します。 整数を設定すると、操作を中断するまでの最大再試行回数を指定できます。
1 に設定すると、レコードロックはレコード自体に配置されます。この設定では、読み取り処理中にロックされたレコードを検出した場合に、そのデータレコードが戻りません。この場合、読み取り処理後のレコード領域の内容は未定義の状態になります。
これを ON に設定した場合に、読み取り処理中にロックされたレコードを検出すると、READ NEXT 操作では、ロックされたレコードの次にあるレコードが返されます。
注:
ロックされたレコードへのアクセスを省略するために、START KEY IS GREATER THAN.. 文を使用することもできます。
ロックを取得したプログラムが次のどれかの操作を行うと、すべてのレコードロックが解放されます。
さらに、ロックを取得したプログラムが START 以外のファイル操作でファイルの他のレコードにアクセスした場合は、単一レコードロックが解放されます。
プログラムをマルチユーザ環境で実行する場合は、次のファイル状態コードを常に確認することが必要です。
| 9/065 | この状態コードは、OPEN 文により返され、ファイルがロックされていることを示します。 |
| 9/068 | この状態コードは、READ 文、DELETE 文 または REWRITE 文により返され、レコードがロックされていることを示します。 |
| 9/213 | この状態コードは、最大許容ロック数に達したことを示します。最大許容ロック数は、ネットワークとオペレーティングシステムによって異なります。 |
ファイルロックとレコードロックのアプリケーション例が提供されます。この例は、メインプログラムである LOCKING.CBL と、このメインプログラムで呼び出される他のプログラムから構成されます。Infomgr を使用してこのアプリケーション例を検索できます。
このアプリケーションを実行するときには、最初にオプション 4 を使用してファイルを作成します。レコードロックの影響を表示するには、複数のセッションでオプション 2 と 3 を使用します。
Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書、ならびに使用されている固有の商標と商品名は国際法で保護されています。
![]() | ファイル状態 | ファイルハンドラの構成 | ![]() |