LOCKコマンドは、リソース名を予約し解放し、そして、GT.Mプロセスのセマフォ機能を提供します。この機能は、プロセス間の同期とシグナルに使用できます。
LOCKを割り当てると、変数を超える明示的な制御を指定しません、そして、グローバル(またはローカル)データへの読み取りまたは書き込みアクセスのどちらかには直接影響はしません。ただし、任意のアクセス前にLOCKすることが明確に定義された規則に準拠するアプリケーションは、間接的にそのような効果を得ることができます。
FISでは、LOCKではなくトランザクション処理を使用してデータベースの一貫性を実装することを推奨しています。GT.MのTPに対するオプティミスティック並行性の使用を避けたい場合は、オリジナルのTSTARTの直前にLOCKを置き、最終的なTCOMMITの後にリリースしてください。
LOCKコマンドのフォーマットは:
L[OCK][:tvexpr] [[-|+]nref|(nref[,...])[:numexpr] [,...]]
オプションでコマンド直後に続く真理値の式は、GT.Mがコマンドを実行するかどうかをコントロールする後置コマンドです。
nref 引数は、添字の有無、そして、前にキャレット( ^ )があろうとなかろうと、GT.M名のフォーマットでリソース名を指定します。nref は、前のキャレット(^)のないものを含め、必要に応じて環境の仕様を持つことができます。
トランザクションの外で、環境中の1つのプロセスだけが指定された時間に特定のLOCKを所有することができます。
GT.Mのデータストレージは階層散在配列を使用し、LOCKが頻繁に複数のプロセスで不適切な "同時" アクセスからデータを保護するために提供されるので、LOCKは階層構造の様式でリソース名を扱います; LOCKは名前付きのリソースを保護するだけでなく、その上位と下位のノードも保護します。
1つ以上の nrefs がカッコ ()で囲まれている場合、LOCKは囲まれたすべての名前を "同時" にリザーブします、つまり、すべてが使用できるようになるまで、それらのどれをもリザーブします。
先頭に符号付き引数がなく、あるいは、引数のないLOCKは、プロセスによって以前のLOCKコマンドで現在予約されているすべての名前をリリースします; LOCKが引数を持っていない時に、行の中で次のコマンドと区別するために、LOCKに続き少なくとも2つのスペースが必要です。
先頭のプラス記号(+)のあるLOCKの引数は、現在保持されているリソースを解放せずに名前付きリソースを取得し、もし名前のリソースがすでにLOCKされている場合、そのようなLOCKは、リソースの関心あるプロセスを "カウントアップ" します。
先頭にマイナス記号(-)があるLOCKの引数は、名前付きリソース内の関心プロセスを "カウントダウン" します; もし特定のLOCKのカウントが0(ゼロ)に達すると、GT.Mは、他の現在保持されているロックは解放せずにLOCKを解除します;プロセスが現在所有していない名前付きリソースを解放するLOCKは効果がありません。
GT.Mは、名前付きリソースの "プロセス関心" ロックカウンタが511までインクリメントできるようにします。
オプションの数値式は、失敗した場合にコマンドがタイムアウトするまでの時間を秒単位で指定します; 0 は単一の試行を提供します。時限LOCKコマンドは、成功したLOCKアクションの場合は $TEST:1、失敗した場合は0(指定された時間内)のLOCKアクションを維持します。時間指定のないLOCKコマンドは、$TESTを変更しないことに注意してください。
LOCK_SPACEに空きがなく、待機中のLOCKを待ち行列に入れることができないため、LOCK_SPACEが使用可能になるのを待っています。もしLOCKが指定されたタイムアウトで指定されたリソースの所有権を取得しない場合、$TEST=0 を使用してアプリケーションに制御を返します。タイムアウトが指定されていない場合、LOCKは空きができるまでポーリングを続行します。
TPトランザクションのLOCKコマンドがタイムアウトを指定していないか、または 2 が $TRETRYより小さい場合、$gtm_tpnotacidtime で指定された制限を超えるタイムアウトが発生すると、プロセスはデータベースクリティカルセクションを解放し、プロセスをライブロックするTPNOACIDメッセージを生成し、おそらく $ZMAXTPTIMEに達してトランザクションが終了するまでです。このようなプロセスはシステムのパフォーマンスに影響する可能性がありますが、この動作は他のデータベース操作に対するデッドロックの影響を緩和します。
間接指定演算子と1つ以上のLOCKの引数リストに評価される原子式(expression atom)は、LOCKのための正当な引数を構成します。
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という名前の場合に、デッドロックが発生します。
そのようなコマンドが以前にすべて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の管理および操作ガイドのそのユーティリティに関する章を参照してください。