ファイルの共有

ここでは、ファイルロックとレコードロックを使用して、マルチユーザ環境で複数のユーザが同じデータを同時に変更できないようにする方法について説明します。

共有モード

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

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

共有モード 説明 
SHARING WITH NO OTHER このモードを設定したファイルを他のユーザと共有できません。
SHARING WITH READ ONLY ファイルを入力ファイルとして開く場合は、他のユーザとの共有が可能です。
SHARING WITH ALL OTHER 他のすべてのユーザとの共有が可能です。

各共有モードでの OPEN 操作の結果を示す詳細な表については、次のヘルプトピックにある『別のファイル結合子で現在開いている利用可能な共有ファイルを開く』の表を参照してください。  『OPEN 文

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

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

指定する条件 共有モード
OPEN 文で WITH LOCK 指定をした場合 SHARING WITH NO OTHER
SELECT 句で LOCK MODE IS EXCLUSIVE 指定をした場合 SHARING WITH NO OTHER
SELECT 句で LOCK MODE IS MANUAL または LOCK MODE IS AUTOMATIC 指定をした場合 SHARING WITH ALL OTHER
OPEN 文のモードが OUTPUT、I-O または EXTEND の場合 SHARING WITH NO OTHER
OPEN 文のモードが INPUT で構成オプション OPENINPUTSHARED が OFF に設定されている場合 SHARING WITH READ ONLY
OPEN 文のモードが INPUT で構成オプション OPENINPUTSHARED が ON に設定されている場合 SHARING WITH ALL OTHER

レコードロック

ファイルの共有が有効である場合は、個々のレコードにロックを設定できます。 レコードにロックを設定すると、他のユーザは、ロックされたレコードを呼び出せず、ロック解除されているレコードを呼び出すようになります。

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

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

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

手動レコードロック

手動レコードロックを使用する場合は、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

自動レコードロック

自動レコードロックを使用する場合には、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 操作は同じレコードを呼び出します。

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

構成オプション 説明 
IGNORELOCK これを ON に設定すると、入力用に開いたファイルを読み取るときにレコードロックを無視します。
RETRYLOCK これを ON に設定すると、ロックされたレコードへの呼び出し処理が成功するまで再試行します。 整数を設定すると、操作を中断するまでの最大再試行回数を指定できます。
LOCKTYPE 1 に設定すると、レコードロックはレコード自体の上に配置されます。この設定では、読み取り処理中にロックされたレコードを検出した場合は、そのデータレコードは返りません。 この場合は、読み取り処理後のレコード領域の内容は未定義の状態になります。
SKIPLOCK これを ON に設定した場合は、読み取り処理中にロックされたレコードを検出すると、READ NEXT 操作では、ロックされたレコードの次にあるレコードが返されます。

注:ロックされたレコードをバイパスするために、START…KEY IS GREATER THAN.. 文も使用できます。

レコードロックの解放

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

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

ファイル状態コード

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

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

ロックのアプリケーション例

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

このアプリケーションは、Examples¥Net Express IDE ディレクトリの locking ディレクトリにあります。

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

関連情報
はじめに
ファイル編成
ファイル名
ファイル状態
ファイルハンドラの構成
ファイルハンドラおよびソート API
データとキーの圧縮
ファイル操作のトレース