注意: 9.1 組み込み関数の規則 利用オプション
指定されたユーザー・オブジェクトにロックを試みて、失敗した場合はエラーを戻します。
引数
|
戻り値
|
この組み込み関数でユーザー・オブジェクトをロックすることができます。一度ロックされたユーザー・オブジェクトに対して別のロックを試みると、エラー状態になり、戻りコードに"ER"が戻されます。ただし、すでに現在のジョブでロックされたユーザー・オブジェクトに対してロックを要求する場合は例外となります。この場合、ロック要求は無視され、戻りコードには"IG"が戻されます。
ユーザー・オブジェクトはシステム上の物理ファイルである必要はありません。ロックが必要な「すべて」が対象です。ユーザー・オブジェクトとは物理的というよりも概念的なものです。それは特定の顧客番号やLANSA区画全体を表す場合もあります。制限されるのはユーザーの想像だけです。
'ALL'という語はシステムに予約されており、オブジェクト識別子として使用してはいけません。
このロック手法はユーザー・アプリケーションにより制御されます。オペレーティング・システムにより制御されるのではありません。したがって、ユーザー・オブジェクトのロック状況を調べるのにシステム・コマンドを使用することはできません。
I/Oコマンド・パラメータにLOCK(*YES)を指定してLOCK_OBJECTを使用すれば、以下のような利点があります。
オブジェクト・タイプ引数を使用して、オブジェクト識別子を共通の属性を持つグループに分類することができます。例えば、オブジェクト・タイプを使用して、顧客、オーダー、またはプリンター名などを分類することができます。
このとき、オブジェクト識別子には単独のオブジェクトを指定します。
現在のユーザー・オブジェクト・ロックはDC@FOLファイルに保管されています。DC@FOLには、存在する各ユーザー・オブジェクト・ロックに対して1つのレコードがあります。DC@FOLのレイアウトは以下のとおりです。
|
存在する論理ビューとそのキーは以下のとおりです。
|
注意:このファイルのバックアップと復元はユーザーの責任で行う必要があります。バックアップ実行時に存在したすべてのロックは、そのバックアップが復元されるときに復帰します。
エラーのためLANSAまたはファンクションがクラッシュした場合、存在するすべてのロックは削除されます。ただし、システムがクラッシュした場合、LANSAはロックを削除することはできません。システム・クラッシュのために残されたロックの削除は、ユーザーの責任で行う必要があります。
ユーザー・オブジェクト・ロックは自動で解除されるか、またはUNLOCK_OBJECT組み込み関数が使用されたときに解除されます。
LOCK_OBJECTでは、ロック・レベルを使用してユーザー・オブジェクトのロックを自動解除するタイミングを決定します。
例
4つのユーザー・オブジェクト識別子を使用して、ユーザー・オブジェクトのロックを構築します。このロックは総称キーを使って解除できます。
DEFINE FIELD(#RETURN) TYPE(*CHAR) LENGTH(2)
DEFINE FIELD(#STATE) TYPE(*CHAR) LENGTH(3)
DEFINE FIELD(#CUSTNO) TYPE(*CHAR) LENGTH(6)
********** Lock Customers to be Updated
USE BUILTIN(LOCK_OBJECT)
WITH_ARGS('CUSTOMER' #STATE #CUSTNO '' '' 'FUNC') TO_GET(#RETURN)
********** Unlock ALL Customers for the STATE
USE BUILTIN(UNLOCK_OBJECT) WITH_ARGS('CUSTOMER' #STATE 'ALL' '' '' 'FUNC')
TO_GET(#RETURN)
この例では、顧客に関する、多くのユーザー・オブジェクトがロックされます。ロックされた「顧客」のすべては、同じ「状態」に属します。更新処理が完了したときに、このロックを解除することができます。各顧客に対してロックを個別に解除するのではなく、2番目のオブジェクト識別子に'ALL'を指定することで、状態に対してすべてのロックを総称的に解除することができます。
また、ユーザー・オブジェクトのロックを使用して、ファンクションが持つことのできる同時ユーザー数を制限することもできます。例えば、ユーザーのオーダー入力ファンクションを3人のユーザーに制限する場合、ユーザーに関連する3つのユーザー・オブジェクトを作成します。次に、オーダー入力ファンクションの先頭で、このユーザー・オブジェクトの1つに対してロックを取得します。使用できるものがなくなると、以下のようなメッセージを表示してファンクションを終了することができます。ロックが許可された場合、ファンクションの使用を許可します。ファンクションを終了するときにユーザー・オブジェクトのロック解除を忘れないようにしてください。または、ロック・レベルに'FUNC'を指定して、ファンクションが終了したときにロックが自動で解除されるようにしてください。一つのガイドとして以下の例を使用してください。
DEFINE FIELD(#RETURN) TYPE(*CHAR) LENGTH(2)
********** Attempt lock on 1st instance
USE BUILTIN(LOCK_OBJECT)
WITH_ARGS('ORDER_ENTRY' 'ORDER#1' '' '' '' 'FUNC') TO_GET(#RETURN)
IF COND('#RETURN *EQ ER')
********** Attempt lock on 2nd instance
USE BUILTIN(LOCK_OBJECT)
WITH_ARGS('ORDER_ENTRY' 'ORDER#2' '' '' '' 'FUNC') TO_GET(#RETURN)
IF COND('#RETURN *EQ ER')
********** Attempt lock on 3rd instance
USE BUILTIN(LOCK_OBJECT)
WITH_ARGS('ORDER_ENTRY' 'ORDER#3' '' '' '' 'FUNC') TO_GET(#RETURN)
IF COND('#RETURN *EQ ER')
********** Cannot obtain any locks
MESSAGE MSGTXT('No Order Entry sessions are Available')
RETURN
ENDIF
ENDIF
ENDIF
********** Protected processing
********** Unlock ALL Order Entry locks for this Function
USE BUILTIN(UNLOCK_OBJECT) WITH_ARGS('ORDER_ENTRY' 'ALL' '' '' '' 'FUNC') TO_GET(#RETURN)