FILELOCK ステートメント

構文

FILELOCK [ file.variable ] [ , lock.type ] 
[ON ERROR statements] [LOCKED statements]

説明

FILELOCK ステートメントは、ファイル全体にロックを設定します。 このロックは、プログラムが解放するまでファイルがほかのユーザーから更新されるのを防ぎます。 lock.type を指定しない FILELOCK ステートメントは、ファイルの全レコードに対して更新レコード・ロックを取得するのに相当します。

file.variable は、開いているファイルを指定します。file.variable が指定されていない場合、デフォルトのファイルが仮定されます (デフォルトのファイルの詳細については、OPEN ステートメントを参照してください)。 このファイルにアクセスできず、開くこともできない場合、プログラムはランタイム・エラー・メッセージを表示して強制終了します。 file.variable が NULL 値として評価されると、FILELOCK ステートメントは正しく実行されずプログラムはランタイム・エラー・メッセージを出力して終了します。

lock.type は、以下のキーワードの 1 つとして評価される式です。

ON ERROR 節

ON ERROR 節は FILELOCK ステートメントのオプションです。 ON ERROR 節では、FILELOCK ステートメントの処理中に致命的エラーが検出される場合のプログラム終了の代替手段を指定できます。

致命的エラーが発生して、ON ERROR 節が指定されていない場合、または無視された場合 (アクティブなトランザクション時など) には、次のことが発生します。

致命的エラーは、次のいずれかが発生すると起こり得ます。

ON ERROR 節が使用される場合、STATUS 関数によって返される値はエラー番号です。 ファイルの一部がロックされているときに FILELOCK ステートメントを使用すると、プログラムはファイルが解放されるまで待ちます。

LOCKED 節

LOCKED 節はオプションですが、推奨されます。 LOCKED 節は、FILELOCK ステートメントの処理を防ぐ競合ロック (別のユーザーが設定する) によって発生する条件を取り扱います。 以下の競合ロックのいずれか 1 つがあると、LOCKED 節が実行されます。

これが要求されるロック...
競合
共有ファイル・ロック
排他ファイル・ロック、意図的ファイル・ロック、更新レコード・ロック
意図的ファイル・ロック
排他ファイル・ロック、意図的ファイル・ロック、共有ファイル・ロック、更新レコード・ロック
排他ファイル・ロック
排他ファイル・ロック、意図的ファイル・ロック、共有ファイル・ロック、更新レコード・ロック、共有レコード・ロック

FILELOCK ステートメントが LOCKED 節を含まず、競合ロックが存在する場合は、プログラムはロックが解放されるまで一時的に停止します。

LOCKED 節が使用される場合、STATUS 関数によって返される値は、競合ロックを所有するユーザーの端末番号です。

ロックの解除

共有ファイル・ロック、意図的ファイル・ロック、排他ファイル・ロックは、構文、RELEASE 文、または STOP 文によって解除できます。

トランザクション内で取得または昇格されるロックは、それ以前の文が処理されるまでは解放されません。

OPEN '','SUN.MEMBER' TO DATA ELSE STOP "CAN'T OPEN 
FILE"
FILELOCK DATA LOCKED STOP 'FILE IS ALREADY LOCKED'
FILEUNLOCK DATA
OPEN '','SUN.MEMBER' ELSE STOP "CAN'T OPEN FILE"
FILELOCK LOCKED STOP 'FILE IS ALREADY LOCKED'
PRINT "The file is locked."
FILEUNLOCK

次のプログラム出力が得られます。

The file is locked.

次の例は、意図的ファイル・ロックを取得します。

FILELOCK fvar, "INTENT" LOCKED
   owner = STATUS( )
   PRINT "File already locked by":owner
   STOP
END