ALLOCATE_UNIQUE ストアドプロシージャは、ロック名に対して一意のロックIDを申請するために使用されます。ロックIDの値域は(1073741824, 1999999999)です。ロックIDはアプリケーション間でのロックの使用を調整するために使用され、名前を使用したロックの方がIDを使用したロックよりも便利です。
機能の適用範囲
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
構文
DBMS_LOCK.ALLOCATE_UNIQUE (
lockname IN VARCHAR2,
lockhandle OUT VARCHAR2,
expiration_secs IN INTEGER DEFAULT 864000);
パラメータの説明
パラメータ |
説明 |
|---|---|
| lockname | ロック名を指定します。ORA$ で始まらないように注意してください。 |
| lockhandle | ALLOCATE_UNIQUE によって生成されたロックハンドルを返します。これに対して REQUEST 操作を実行できます。任意のセッションが ALLOCATE_UNIQUE を使用して同じロック名で取得したロックハンドルは、すべて同じロックを指します。lockhandle の最大長は VARCHAR2 (128) です。 |
| expiration_secs | ALLOCATE_UNIQUE で取得したロックはすべて、DBMS_LOCK_ALLOCATED テーブルにレコードとして保存されます。expiration_secs はそのレコードの保持時間を指定し、この時間内に対応するロックマッピングはクリーンアップされません。デフォルトのタイムアウト時間は10日間です。ALLOCATE_UNIQUE は期限切れのロックを自動的にクリーンアップするため、手動で DBMS_LOCK_ALLOCATED テーブルのデータを削除する必要はありません。 |
注意事項
最初に ALLOCATE_UNIQUE を使用してロック名を指定してハンドルを申請するセッションは、そのロック名に対して一意のロックIDを生成し、テーブル DBMS_LOCK_ALLOCATED に保存します。後から同じロック名で ALLOCATE_UNIQUE を使用するセッションは、以前に生成されたロックIDを返されます。
ロック名とロックIDのマッピングは、expiration_secs で指定された時間内に有効です。期限が過ぎると、DBMS_LOCK_ALLOCATED のマッピングはクリーンアップされ、領域が解放されます。そのため、期限が過ぎた後に同じ名前でロックを申請すると、別のロックとなります。
ALLOCATE_UNIQUE は COMMIT コマンドを実行します。これが ALLOCATE_UNIQUE_AUTONOMOUS との使用上の違いです。
エラーメッセージ
エラーメッセージは以下のとおりです: OBE-20000, ORU-10003: Unable to find or insert lock <lockname> into catalog dbms_lock_allocated.
例
obclient> DELIMITER /
obclient> DECLARE
my_lockname VARCHAR2(100) :='test01';
my_lockhandle VARCHAR2(200);
BEGIN
DBMS_LOCK.ALLOCATE_UNIQUE(lockname => my_lockname,lockhandle => my_lockhandle);
END;/
Query OK, 1 row affected