DBMS_LOCK
パッケージは、Oracle Lock Managementサービスへのインタフェースを提供します。特定モードのロックを要求したり、同一または別のインスタンスにある別のプロシージャ内で識別できる一意の名前をロックに付けたり、ロック・モードの変更およびロックの解放を行うことができます。
関連項目: DBMS_LOCK パッケージの詳細および使用方法の例は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』のユーザー・ロックに関する項を参照してください。 |
この章では、次の項目について説明します。
概要
セキュリティ・モデル
定数
ルールおよび制限
使用上の注意
ユーザー・ロックを使用して、次のことができます。
端末などのデバイスに排他的アクセスを提供します。
アプリケーションレベルの読込みロックを施行します。
ロックの解放時期およびアプリケーション終了後のクリーンアップを検出します。
アプリケーションを同期化し、順次処理を施行します。
使用可能なロックの合計最大数について、オペレーティング・システム固有の制限がある場合があります。これは、ロックの使用時またはこのパッケージを他のユーザーに対して使用可能にするときに考慮する必要があります。特定のユーザーまたはロールに対してのみEXECUTE
権限の付与を検討してください。
使用するロック数を制限するカバー・パッケージを作成してから特定のユーザーにEXECUTE
権限を付与することをお薦めします。カバー・パッケージの例は、DBMS_LOCK.SQL
パッケージ仕様部ファイルに記載されています。カッコ内の略称は、Oracle Enterprise Manager Monitorに表示されるときのロックの略称です。
DBMS_LOCK
パッケージでは、表81-1に示す定数が使用されます。
表83-1 DBMS_LOCKの定数
名前 | 代替名 | タイプ | 値 | OEMでの略称 | 説明 |
---|---|---|---|---|---|
|
|
|
|
- |
- |
|
|
|
|
|
これを集計オブジェクトで使用して、共有ロックがオブジェクトのサブパーツに対して作動中であることを示すことができます。 |
|
|
|
|
|
これを集計オブジェクトで使用して、排他ロックがオブジェクトのサブパーツに対して作動中であることを示すことができます。 |
|
|
|
|
|
- |
|
|
|
|
- |
これは、集計オブジェクト全体で共有ロックを使用している一方、一部のサブパーツではさらに排他ロックを使用している可能性があることを示します。 |
|
|
|
|
|
- |
いくつかのロック・モードがあります(Nl→「NULl」、SS→「半共有(Sub Shared)」、SX→「半排他(Sub eXclusive)」、S→「共有(Shared)」、SSX→「共有半排他(Shared Sub eXclusive)」、X→「排他(eXclusive)」)。
別のプロセスが保持状態のときに、取得を試みると次のようになります。
表83-2 ロックの互換性
保持モード | NLの取得 | SSの取得 | SXの取得 | Sの取得 | SSXの取得 | Xの取得 |
---|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
maxwait constant integer := 32767;
定数maxwait
は、無期限に待機します。
ユーザー・ロックは接頭辞「UL」で識別されるため、Oracleロックと競合することはありません。これらのロックは、Enterprise Managerのロック・モニター画面または適切な固定ビューを使用して表示できます。ユーザー・ロックは、セッションの終了時に自動的に解除されます。ロック識別子は、0から1073741823の番号です。
確保されているユーザー・ロックは、Oracleロックと同一であるため、デッドロック検出などのOracleロックの機能をすべて備えています。分散トランザクションで使用されるユーザー・ロックがCOMMIT
時に解除されることを確認し、解除されない場合は、デッドロックが検出されない可能性があります。
DBMS_LOCK
は、セッション当たりのロック数を200から300に制限すると、最も効率的です。プロシージャ間で同一のロックを使用して競合が発生しないように、ロックの使用について標準規則を作成することをお薦めします。たとえば、ロック名の一部に会社名を含める方法があります。
表83-3 DBMS_LOCKパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
|
名前付きロックに一意のロックIDを割り当てます。 |
|
ロックのモードを別のモードに変換します。 |
|
ロックを解放します。 |
|
特定のモードのロックを要求します。 |
|
セッヨンを指定時間だけスリープさせます。 |
このプロシージャは、一意のロック識別子(1073741824から1999999999の範囲内)を指定のロック名に割り当てます。アプリケーションは、ロック識別子を使用してロックの使用方法を調整できます。これは、アプリケーションでロックの使用方法を調整するには、ロック番号よりロック名に基づいた方が容易になるためです。
構文
DBMS_LOCK.ALLOCATE_UNIQUE ( lockname IN VARCHAR2, lockhandle OUT VARCHAR2, expiration_secs IN INTEGER DEFAULT 864000);
パラメータ
表83-4 ALLOCATE_UNIQUEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
一意のIDを生成するロックの名前。
|
|
このハンドルは、 ハンドルは実際のロックIDのかわりに戻され、プログラミング・エラーにより不適切であるが有効なロックIDが作成されないようにします。これにより、このパッケージを使用するアプリケーション間の独立性が高まります。
|
|
指定のロックに最後の デフォルトの待機期間は10日間です。この表からロックを削除しないでください。 |
使用上の注意
ロックを名前で識別する場合は、ALLOCATE_UNIQUE
を使用して、名前付きロックに一意のロック識別番号を生成できます。
新規ロック名でALLOCATE_UNIQUE
をコールする最初のセッションで、一意のロックIDが生成され、dbms_lock_allocated
表に格納されます。次のコール(通常は他のセッションによる)では、前のセッションで生成されたロックIDが戻ります。
ロック名は、指定のロック名でALLOCATE_UNIQUE
を最後にコールした後、少なくともexpiration_secs
(デフォルトは10日間)の間は、戻されたロックIDに関連付けられています。この期間を経過すると、このロック名のdbms_lock_allocated
表にある行は、領域リカバリのために削除される場合があります。ALLOCATE_UNIQUE
はコミットを実行します。
注意: Oracleでは、SQLを使用して指定の名前に関連付けられたロックを判断するため、名前付きユーザー・ロックを使用すると効率が悪くなる場合があります。 |
このファンクションは、ロックを別のモードに変換します。CONVERT
はオーバーロードされたファンクションで、ユーザー定義のロック識別子またはALLOCATE_UNIQUE
プロシージャが戻すロック・ハンドルのいずれかを受け入れます。
構文
DBMS_LOCK.CONVERT( id IN INTEGER || lockhandle IN VARCHAR2, lockmode IN INTEGER, timeout IN NUMBER DEFAULT MAXWAIT) RETURN INTEGER;
パラメータ
表83-5 CONVERTファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
変更するロック・モードのユーザー割当てロック識別子(0から1073741823)または |
|
指定のロックに割り当てる新規モード。 使用可能なモードおよび関連する整数の識別子は、「定数」を参照してください。 |
|
ロック・モードの変更を待つ秒数。 この時間内にロックを変換できない場合、コールは値1(timeout)を戻します。 |
このファンクションは、REQUEST
ファンクションを使用して前に取得したロックを明示的に解放します。ロックは、セッションの終了時に自動的に解放されます。RELEASE
はオーバーロードされたファンクションで、ユーザー定義のロック識別子またはALLOCATE_UNIQUE
プロシージャが戻すロック・ハンドルのいずれかを受け入れます。
構文
DBMS_LOCK.RELEASE ( id IN INTEGER) RETURN INTEGER; DBMS_LOCK.RELEASE ( lockhandle IN VARCHAR2) RETURN INTEGER;
このファンクションは、指定のモードのロックを要求します。REQUEST
はオーバーロードされたファンクションで、ユーザー定義のロック識別子またはALLOCATE_UNIQUE
プロシージャが戻すロック・ハンドルのいずれかを受け入れます。
構文
DBMS_LOCK.REQUEST( id IN INTEGER || lockhandle IN VARCHAR2, lockmode IN INTEGER DEFAULT X_MODE, timeout IN INTEGER DEFAULT MAXWAIT, release_on_commit IN BOOLEAN DEFAULT FALSE) RETURN INTEGER;
X_MODE
やMAXWAIT
などの現行のデフォルト値は、DBMS_LOCK
パッケージ仕様部で定義されています。
パラメータ
表83-9 REQUESTファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
変更するロック・モードのユーザー割当てロック識別子(0から1073741823)または |
|
要求するロックのモード。 使用可能なモードおよび関連する整数の識別子は、「定数」を参照してください。 |
|
ロックの付与を待つ秒数。 この時間内にロックが付与できない場合、コールは値1( |
|
このパラメータを そうでない場合は、ロックが明示的に解放されるかセッションが終了するまで、ロックは解放されません。 |