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