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 を使用して同じロック名で取得した Lock Handle はすべて、同一のロックを指します。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