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