94 DBMS_LOCK

DBMS_LOCKパッケージは、Oracle Lock Managementサービスへのインタフェースを提供します。

特定モードのロックを要求したり、同一または別のインスタンスにある別のプロシージャ内で識別できる一意の名前をロックに付けたり、ロック・モードの変更およびロックの解放を行うことができます。

この章のトピックは、次のとおりです:

参照:

詳細およびDBMS_LOCKパッケージの使用方法の例は、『Oracle Database開発ガイド』を参照してください。

94.1 DBMS_LOCKの概要

DBMS_LOCKパッケージには、多くの有用な用途があります。

これらの用途には次のものがあります。

  • 端末などのデバイスに排他的アクセスを提供します。

  • アプリケーションレベルの読込みロックを施行します。

  • ロックの解放時期およびアプリケーション終了後のクリーンアップを検出します。

  • アプリケーションを同期化し、順次処理を施行します。

94.2 DBMS_LOCKのセキュリティ・モデル

使用可能なロックの合計最大数について、オペレーティング・システム固有の制限がある場合があります。これは、ロックの使用時またはこのパッケージを他のユーザーに対して使用可能にするときに考慮する必要があります。特定のユーザーまたはロールに対してのみEXECUTE権限の付与を検討してください。

使用するロック数を制限するカバー・パッケージを作成してから特定のユーザーにEXECUTE権限を付与することをお薦めします。カバー・パッケージの例は、DBMS_LOCK.SQLパッケージ仕様部ファイルに記載されています。カッコ内の略称は、Oracle Enterprise Manager Monitorに表示されるときのロックの略称です。

94.3 DBMS_LOCKの定数

DBMS_LOCKパッケージには、パラメータ値の指定時に使用するいくつかの定数が含まれます。

これらの定数を、次の表に示します。

表94-1 DBMS_LOCKの定数

名前 代替名 タイプ OEMでの略称 説明

NL_MODE

NuL1

INTEGER

1

-

-

SS_MODE

半共有

INTEGER

2

ULRS

これを集計オブジェクトで使用して、共有ロックがオブジェクトのサブパーツに対して作動中であることを示すことができます。

SX_MODE

  • 半排他

  • 行排他モード

INTEGER

3

ULRX

これを集計オブジェクトで使用して、排他ロックがオブジェクトのサブパーツに対して作動中であることを示すことができます。

S_MODE

  • 共有

  • 行排他モード

  • 意図的排他

INTEGER

4

ULRSX

-

SSX_MODE

  • 共有半排他

  • 行排他モードの共有

INTEGER

5

-

これは、集計オブジェクト全体で共有ロックを使用している一方、一部のサブパーツではさらに排他ロックを使用している可能性があることを示します。

X_MODE

排他

INTEGER

6

ULX

-

いくつかのロック・モードがあります(Nl→「NULl」、SS→「半共有(Sub Shared)」、SX→「半排他(Sub eXclusive)」、S→「共有(Shared)」、SSX→「共有半排他(Shared Sub eXclusive)」、X→「排他(eXclusive)」)。

94.4 DBMS_LOCK。ルールおよび制限

別のプロセスが保持状態のときに取得を試みると、保持モードおよび取得のタイプに応じて、取得が成功または失敗します。

次の表で結果を説明します。

表94-2 ロックの互換性

保持モード NLの取得 SSの取得 SXの取得 Sの取得 SSXの取得 Xの取得

NL

成功

成功

成功

成功

成功

成功

SS

成功

成功

成功

成功

成功

失敗

SX

成功

成功

成功

失敗

失敗

失敗

S

成功

成功

失敗

成功

失敗

失敗

SSX

成功

成功

失敗

失敗

失敗

失敗

X

成功

失敗

失敗

失敗

失敗

失敗

maxwait  constant integer := 32767;

定数maxwaitは、無期限に待機します。

94.5 DBMS_LOCKの操作上のノート

ユーザー・ロックは接頭辞「UL」で識別されるため、Oracleロックと競合することはありません。これらのロックは、Enterprise Managerのロック・モニター画面または適切な固定ビューを使用して表示できます。

ユーザー・ロックは、セッションが終了すると自動的に解放されます。ロック識別子は、0から1073741823までの数値です。

確保されているユーザー・ロックは、Oracleロックと同一であるため、デッドロック検出などのOracleロックの機能をすべて備えています。分散トランザクションで使用されるユーザー・ロックがCOMMIT時に解除されることを確認し、解除されない場合は、デッドロックが検出されない可能性があります。

DBMS_LOCKは、セッション当たりのロック数を200から300に制限すると、最も効率的です。プロシージャ間で同一のロックを使用して競合が発生しないように、ロックの使用について標準規則を作成することをお薦めします。たとえば、ロック名の一部に会社名を含める方法があります。

94.6 DBMS_LOCKサブプログラムの要約

この表は、DBMS_LOCKサブプログラムを示し、簡単に説明しています。

表94-3 DBMS_LOCKパッケージのサブプログラム

サブプログラム 説明

ALLOCATE_UNIQUEプロシージャ

名前付きロックに一意のロックIDを割り当てます。

CONVERTファンクション

ロックのモードを別のモードに変換します。

RELEASEファンクション

ロックを解放します。

REQUESTファンクション

特定のモードのロックを要求します。

SLEEPプロシージャ

セッションを指定時間だけスリープさせます。

94.6.1 ALLOCATE_UNIQUEプロシージャ

このプロシージャは、一意のロック識別子(1073741824から1999999999の範囲内)を指定のロック名に割り当てます。アプリケーションは、ロック識別子を使用してロックの使用方法を調整できます。これは、アプリケーションでロックの使用方法を調整するには、ロック番号よりロック名に基づいた方が容易になるためです。

構文

DBMS_LOCK.ALLOCATE_UNIQUE (
   lockname         IN  VARCHAR2,
   lockhandle       OUT VARCHAR2,
   expiration_secs  IN  INTEGER   DEFAULT 864000);

パラメータ

表94-4 ALLOCATE_UNIQUEプロシージャのパラメータ

パラメータ 説明

lockname

一意のIDを生成するロックの名前。

ORA$で始まるロック名は使用しないでください。これはオラクル社で提供する製品用に予約されています。

lockhandle

ALLOCATE_UNIQUEが生成したロックIDにハンドルを戻します。

このハンドルは、REQUESTCONVERTおよびRELEASEへの次のコールで使用できます。

ハンドルは実際のロックIDのかわりに戻され、プログラミング・エラーにより不適切であるが有効なロックIDが作成されないようにします。これにより、このパッケージを使用するアプリケーション間の独立性が高まります。

LOCKHANDLEは、VARCHAR2(128)まで可能です。

ALLOCATE_UNIQUEが同じロック名で戻したロック・ハンドルを使用しているすべてのセッションは、同じロックを参照します。したがって、ロック・ハンドルを別のセッションに渡さないでください。

expiration_specs

指定のロックに最後のALLOCATE_UNIQUEを実行した後、DBMS_LOCK_ALLOCATED表からロックの削除を許可するまで待機する秒数。

デフォルトの待機期間は10日間です。この表からロックを削除しないでください。ALLOCATE_UNIQUEへの次のコールで、期限切れのロックを削除し、領域をリカバリできます。

使用上のノート

ロックを名前で識別する場合は、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>を挿入することも検出することもできません。

94.6.2 CONVERTファンクション

このファンクションは、ロックを別のモードに変換します。CONVERTはオーバーロードされたファンクションで、ユーザー定義のロック識別子またはALLOCATE_UNIQUEプロシージャが戻すロック・ハンドルのいずれかを受け入れます。

構文

DBMS_LOCK.CONVERT(
   id         IN INTEGER || 
   lockhandle IN VARCHAR2,
   lockmode   IN INTEGER,
   timeout    IN NUMBER DEFAULT MAXWAIT)
  RETURN INTEGER;

パラメータ

表94-5 CONVERTファンクションのパラメータ

パラメータ 説明

idまたはlockhandle

変更するロック・モードのユーザー割当てロック識別子(0から1073741823)またはALLOCATE_UNIQUEが戻すロック・ハンドル。

lockmode

指定のロックに割り当てる新規モード。

使用可能なモードおよび関連する整数の識別子は、「定数」を参照してください。

timeout

ロック・モードの変更を待つ秒数。

この時間内にロックを変換できない場合、コールは値1(timeout)を戻します。

戻り値

表94-6 CONVERTファンクションの戻り値

戻り値 説明

0

成功。

1

タイムアウト

2

デッドロック

3

パラメータ・エラー

4

idまたはlockhandleが指定するロックを所有していません。

5

不正なロック・ハンドル

94.6.3 RELEASEファンクション

このファンクションは、REQUESTファンクションを使用して前に取得したロックを明示的に解放します。

ロックは、セッションの終了時に自動的に解放されます。RELEASEはオーバーロードされたファンクションで、ユーザー定義のロック識別子またはALLOCATE_UNIQUEプロシージャが戻すロック・ハンドルのいずれかを受け入れます。

構文

DBMS_LOCK.RELEASE (
   id         IN INTEGER)
  RETURN INTEGER;

DBMS_LOCK.RELEASE (
   lockhandle IN VARCHAR2)
  RETURN INTEGER;

パラメータ

表94-7 RELEASEファンクションのパラメータ

パラメータ 説明

idまたはlockhandle

変更するロック・モードのユーザー割当てロック識別子(0から1073741823)またはALLOCATE_UNIQUEが戻すロック・ハンドル。

戻り値

表94-8 RELEASEファンクションの戻り値

戻り値 説明

0

成功。

3

パラメータ・エラー

4

idまたはlockhandleが指定するロックを所有していません。

5

不正なロック・ハンドル

94.6.4 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_MODEMAXWAITなどの現行のデフォルト値は、DBMS_LOCKパッケージ仕様部で定義されています。

パラメータ

表94-9 REQUESTファンクションのパラメータ

パラメータ 説明

idまたはlockhandle

変更するロック・モードのユーザー割当てロック識別子(0から1073741823)またはALLOCATE_UNIQUEが戻すロック・ハンドル。

lockmode

要求するロックのモード。

使用可能なモードおよび関連する整数の識別子は、「定数」を参照してください。

timeout

ロックの付与を待つ秒数。

この時間内にロックが付与できない場合、コールは値1(timeout)を戻します。

release_on_commit

このパラメータをTRUEに設定すると、ロックをコミットまたはロールバック時に解放します。

そうでない場合は、ロックが明示的に解放されるかセッションが終了するまで、ロックは解放されません。

戻り値

表94-10 REQUESTファンクションの戻り値

戻り値 説明

0

成功。

1

タイムアウト

2

デッドロック

3

パラメータ・エラー

4

idまたはlockhandleで指定されたロックをすでに所有しています。

5

不正なロック・ハンドル

94.6.5 SLEEPプロシージャ

このプロシージャは、指定時間だけセッションを中断します。

構文

DBMS_LOCK.SLEEP (
   seconds  IN NUMBER);

パラメータ

表94-11 SLEEPプロシージャのパラメータ

パラメータ 説明

seconds

セッションを中断する時間(秒)。

入力できる最小増分値は100分の1秒です。たとえば、1.95は有効な時間値です。