9.130 LOCK_OBJECT
注意: 9.1 組み込み関数の規則 利用オプション
指定されたユーザー・オブジェクトにロックを試みて、失敗した場合はエラーを戻します。
引数
番号 | タイプ | 必須/任意 | 記述 | 最小長 | 最大長 | 最小小数桁数 | 最大小数桁数 |
|---|---|---|---|---|---|---|---|
1 | A | 必須 | オブジェクト・タイプ | 1 | 20 | ||
2 | A | 任意 | オブジェクト識別子1 | 1 | 10 | ||
3 | A | 任意 | オブジェクト識別子2 | 1 | 10 | ||
4 | A | 任意 | オブジェクト識別子3 | 1 | 10 | ||
5 | A | 任意 | オブジェクト識別子4 | 1 | 10 | ||
6 | A | 任意 | ロック・レベル FUNC = ファンクション(デフォルト) JOB = ジョブ PERM = 永久 | 3 | 4 |
戻り値
番号 | タイプ | 必須/任意 | 記述 | 最小長 | 最大長 | 最小小数桁数 | 最大小数桁数 |
|---|---|---|---|---|---|---|---|
1 | A | 必須 | 戻りコード OK = オブジェクトが正常にロックされた IG = ロック要求は無視された。オブジェクトは現在のジョブですでにロックされています。 ER = オブジェクトにはロックがすでに存在する | 2 | 2 | ||
2 | A | 任意 | ロック・ジョブのジョブ名 | 1 | 10 | ||
3 | A | 任意 | ロック・ジョブのユーザー | 1 | 10 | ||
4 | A | 任意 | ロック・ジョブのジョブ番号 | 1 | 6 |
この組み込み関数でユーザー・オブジェクトをロックすることができます。一度ロックされたユーザー・オブジェクトに対して別のロックを試みると、エラー状態になり、戻りコードに"ER"が戻されます。ただし、すでに現在のジョブでロックされたユーザー・オブジェクトに対してロックを要求する場合は例外となります。この場合、ロック要求は無視され、戻りコードには"IG"が戻されます。
ユーザー・オブジェクトはシステム上の物理ファイルである必要はありません。ロックが必要な「すべて」が対象です。ユーザー・オブジェクトとは物理的というよりも概念的なものです。それは特定の顧客番号やLANSA区画全体を表す場合もあります。制限されるのはユーザーの想像だけです。
'ALL'という語はシステムに予約されており、オブジェクト識別子として使用してはいけません。
このロック手法はユーザー・アプリケーションにより制御されます。オペレーティング・システムにより制御されるのではありません。したがって、ユーザー・オブジェクトのロック状況を調べるのにシステム・コマンドを使用することはできません。
I/Oコマンド・パラメータにLOCK(*YES)を指定してLOCK_OBJECTを使用すれば、以下のような利点があります。
- 適切なロック「プロトコル」を工夫することができます。例えば、LOCK_OBJECT ('ORDER' #ORDNUM) は、#ORDNUMにより特定されるオーダーをロックする「プロトコル」です。プロトコルを使用すれば、3つの異なるデータベース・ファイルにまたがるオーダー・ヘッダー、関連する行項目、行項目請求をロックする方法を、ユーザー・アプリケーションで心配する/考える必要はありません。
- 内部オペレーティング・システムに依存しません。例えば、IBM i は、前後イメージのフル・コミットメント制御が使用されるときに同じファイルの複数レコードのロックを行いますが、他の状況では行いません。
- 複数のオブジェクトを容易にロックすることができます。
- どのような状況にも対処するオブジェクトを「創造」することができ、ファイルの「レコード」に依存することはなくなります。
- 何日、何ヶ月、何年でも「永久」にロックし続けることができます。
オブジェクト・タイプ引数を使用して、オブジェクト識別子を共通の属性を持つグループに分類することができます。例えば、オブジェクト・タイプを使用して、顧客、オーダー、またはプリンター名などを分類することができます。
このとき、オブジェクト識別子には単独のオブジェクトを指定します。
現在のユーザー・オブジェクト・ロックはDC@FOLファイルに保管されています。DC@FOLには、存在する各ユーザー・オブジェクト・ロックに対して1つのレコードがあります。DC@FOLのレイアウトは以下のとおりです。
フィールド名 | 長さ | 説明 |
|---|---|---|
FOLP#I | 3A | 区画識別子 |
FOLTYP | 20A | オブジェクト・タイプ |
FOLID1 | 10A | オブジェクト識別子1 |
FOLID2 | 10A | オブジェクト識別子2 |
FOLID3 | 10A | オブジェクト識別子3 |
FOLID4 | 10A | オブジェクト識別子4 |
FOLLVL | 4A | ロック・レベル |
FOLMOD | 10A | プロセス名 |
FOLFMT | 7A | ファンクション名 |
FOLJNL | 10A | ロックしたジョブ名 |
FOLJ#L | 6A | ロックしたジョブ番号 |
FOLUSL | 10A | ロックしたユーザー |
FOLTDS | 12S 0 | 時間/日付スタンプ - システム・フォーマット |
存在する論理ビューとそのキーは以下のとおりです。
論理ファイル | キー順 | 使用方法 |
|---|---|---|
DC@FOLV1 | FOLP#I、FOLTYP、FOLID1、FOLID2、FOLID3、FOLID4 | 読み取り専用 |
DC@FOLV2 | DC@FOLV1と同じ | 更新 |
DC@FOLV3 | FOLLVL、FOLJ#L、FOLMOD、FOLFMT、FOLP#I、FOLTYP、FOLID1、FOLID2、FOLID3、FOLID4 | 読み取り専用 |
DC@FOLV4 | DC@FOLV3と同じ | 更新 |
注意:このファイルのバックアップと復元はユーザーの責任で行う必要があります。バックアップ実行時に存在したすべてのロックは、そのバックアップが復元されるときに復帰します。
エラーのためLANSAまたはファンクションがクラッシュした場合、存在するすべてのロックは削除されます。ただし、システムがクラッシュした場合、LANSAはロックを削除することはできません。システム・クラッシュのために残されたロックの削除は、ユーザーの責任で行う必要があります。
ユーザー・オブジェクト・ロックは自動で解除されるか、またはUNLOCK_OBJECT組み込み関数が使用されたときに解除されます。
LOCK_OBJECTでは、ロック・レベルを使用してユーザー・オブジェクトのロックを自動解除するタイミングを決定します。
- ロック・レベル'FUNC'を指定すると、そのロックを作成したファンクションの終了時にそのロックは自動的に解除されます。
- ロック・レベル'JOB'を指定すると、フォームやプロセスなどのジョブの終了時にそのロックは自動的に解除されます。
- ユーザーがLANSAを終了した後でもユーザー・オブジェクト・ロックが必要な場合は、ロック・レベルを'PERM'にする必要があります。これがユーザー・オブジェクトの永久ロックです。このロックは、UNLOCK_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)