Lock

LOCKコマンドは、リソース名を予約し解放し、そして、GT.Mプロセスのセマフォ機能を提供します。この機能は、プロセス間の同期とシグナルに使用できます。

LOCKを割り当てると、変数を超える明示的な制御を指定しません、そして、グローバル(またはローカル)データへの読み取りまたは書き込みアクセスのどちらかには直接影響はしません。ただし、任意のアクセス前にLOCKすることが明確に定義された規則に準拠するアプリケーションは、間接的にそのような効果を得ることができます。

FISでは、LOCKではなくトランザクション処理を使用してデータベースの一貫性を実装することを推奨しています。GT.MのTPに対するオプティミスティック並行性の使用を避けたい場合は、オリジナルのTSTARTの直前にLOCKを置き、最終的なTCOMMITの後にリリースしてください。

LOCKコマンドのフォーマットは:

L[OCK][:tvexpr] [[-|+]nref|(nref[,...])[:numexpr] [,...]]

GT.Mは、"ロックデータベース" 内のLOCKとZALLOCATEの情報を記録します。 GT.Mは、現在のグローバルディレクトリによって識別されるデータベースに関連付けられている空間でロックデータベースを配布しています。しかし、ロックデータベースは、グローバルデータを保持するデータベースファイルの本体とは、重複または一致はしません。唯一のLOCK、ZALLOCATE、ZDEALLOCATEコマンドとLKEユーティリティプログラムは、ロックデータベースにアクセスします。

GT.Mは、同じ名前のグローバル変数をマップするために使用されるデータベースファイルへ アッパーキャレット ^ で始まる名前の予約をマップします。もしグローバルディレクトリがファイル A. DATへ 名前 A をマップする場合、GT.Mは、A.DATに関連付けられているファイルスペースへ ^Aにすべての予約をマップします。

GT.Mは、GDEコマンド LOCK -REGION=で指定されたデータベースの領域へ アッパーキャレット ^ で始まらない名前で予約をマップします。デフォルトでは、GDEがグローバルディレクトリを作成する時は、ローカル名のいずれかの予約は、領域DEFAULTにマップされます。

これら2つの要因は、プログラミング環境で、以下の結果に影響を与えます。

GT.Mは、データベース環境で複数のプロセス間のシグナリングのためにセマフォのようなリソース名を使用してるので、それらはツリー構造の様式でインターロックします。LOCKまたはZALLOCATEが、^D(1)のような添字付きのリソース名を予約する時、プロセスをLOCKする(またはZALLOCATEする)ことによってマップされるデータベースの他のユーザは、LOCKまたはZDEALLOCATEがその名前をリリースするまで、^D のような名前の上位ノード、または、^D(1,2) のような下位ノードは予約できません。

LOCKコマンドの実行は、値や変数の状態には影響しません。LOCKは、プロセスが名前空間を要求できるかどうかを判断するために、各引数をテストします。別のGT.Mプロセスがその名前空間をロックしている場合、他のプロセスが名前空間を解放するまで、GT.Mは、現在のプロセスを中断します。ルーチンの実行の潜在的な "無期限" サスペンション(宙ぶらりん)を防止するため、LOCKコマンドのタイムアウトを指定します。

先頭にプラス(+)またはマイナス( - )記号が付くLOCK(インクリメンタル ロック)は、現在保持されているすべてのロックを解放せずに、ロックの取得と解放を可能にします。これはデッドロックにつながることがあります。例えば、もし2人のユーザーのLOCKリソースが次の順序でAとBという名前の場合に、デッドロックが発生します。

デッドロックの状況

ユーザ X

ユーザ Y

L +A

L +B

L +B

L +A

そのようなコマンドが以前にすべてLOCKされているリソースを解放するため、デッドロックを避けるために、その引数の先頭に + または - 記号なしのLOCKを使用してください; オーダの実績がある良くデザインされたLOCKを均一に実装してください、および/または、LOCKコマンドでタイムアウトを使用してください。

もしLOCKコマンドがタイムアウトを指定し、GT.Mがタイムアウト時間が経過する前に名前付きリソースの所有権を取得した場合、LOCKは$TESTをTRUE(1)にセットします。もしGT.Mが指定されたタイムアウト内の名前付きリソースの所有権を取得できない場合、LOCKは$TESTにFALSE(0)をセットします。もしLOCKコマンドがタイムアウトを指定しない場合、コマンドの実行は $TEST には影響しません。もし先頭にマイナス (-) 記号を持つ引数でのLOCKにタイムアウトを指定する場合、コマンドは常に$TESTをTRUE(1)にセットします。

もしプロセスが、そのプロセスによって既にZALLOCATEされている名前付きのリソースのために、LOCKコマンドを発行する場合、リソースはZALLOCATEとLOCKの両方ともされます。LOCKは、ZALLOCATEされているリソースを解放しません。そのような名前付きリソースを解放するために、プロセスはリソースをZDEALLOCATEとunLOCK(解除)の両方をする必要があります。詳細な情報については、 " ZAllocate " を参照してください。

GT.Mロックユーティリティ(LKE)でのLOCKのトラブルシューティングの詳細については、GT.Mの管理および操作ガイドのそのユーティリティに関する章を参照してください。

inserted by FC2 system