8.132 LOCK_OBJECT

指定されたユーザー・オブジェクトにロックを試みて、失敗した場合はエラーを戻します。

 

引数

番号

タイプ

必須/任意

記述

最小長

最大長

最小小数桁数

最大小数桁数

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を使用すれば、以下のような利点があります。

オブジェクト・タイプ引数を使用して、オブジェクト識別子を共通の属性を持つグループに分類することができます。例えば、オブジェクト・タイプを使用して、顧客、オーダー、またはプリンター名などを分類することができます。

このとき、オブジェクト識別子には単独のオブジェクトを指定します。

現在のユーザー・オブジェクト・ロックは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では、ロック・レベルを使用してユーザー・オブジェクトのロックを自動解除するタイミングを決定します。

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)