Lock() 関数と Unlock() 関数 (1)
ここでは Lock() および Unlock() の機能と使用法について学習します。ロックする場合、システムはロック・テーブルに Lock() コマンドの引数を追加します。別のプロセスで同じレコードをロックしようとすると、最初のロックが解除されるまでそのプロセスを待機します。2 番目のプロセスが異なるレコードを編集し、レコードを Lock() すると、システムはロック・テーブルにもそのレコードを追加します。処理がうまくいくと Lock() は True を返しますが、それ以外の場合は False を返します。Lock() の 2 番目の引数は、タイムアウトの秒です。処理が指定時間内に正常終了しない場合、Lock() は False を返します。
以下の例を実行する前に、管理ポータル ([システム・エクスプローラ] セクション) を使用して、システム, ロック に移動し、ロック・テーブルを確認します。例を実行すると、完了するまで数秒かかるためロックを表示できます。[ロック・テーブル] フォルダをクリックすると、表示を更新できます。
if lock(^x(1),3) then
println "lock successful"
' wait several seconds so lock remains in Lock Table
for i = 1 to 100000000 : next i
else
println "lock failed"
end if
ロックが失敗した場合、ターミナルと ObjectScript Lock コマンドを使用して、同じ項目をロック・テーブルに追加します。その後上記コードを実行します。
SAMPLES>lock ^x(1) ; add ^x(1) to the Lock Table before running example
SAMPLES>lock ; to remove ^x(1) from the Lock Table afterwards
myBASlookup ルーチンの次の段階では、ユーザが個人データを修正できるコードを記述します。つまり、^PersonD グローバルと ^PersonI グローバルを更新します。この場合、ユーザが更新するレコードと特定の ID をいったん選択すると、これをルーチン lock(^PersonD(id)) へ追加します。新規データを格納した後、unlock(^PersonD(id)) を使用してレコードのロックを解除します。