ALLOCATE_UNIQUE_AUTONOMOUS ステートメントは、ユーザーロックを申請するために使用されます。ユーザーはロック名 lockname を指定する必要があります。初回の申請時には、申請したロックがテーブル DBMS_LOCK_ALLOCATED に記録され、lockhandle が返されます。その後の申請時には、既に対応するレコードが存在する場合、直接Lockハンドルが返されます。つまり、2回の申請は同一のロックを指します。
ユーザーロックはタイムアウトすることがあり、タイムアウト時間は expiration_secs で指定されます。タイムアウト後、DBMS_LOCK_ALLOCATED テーブル内の該当するレコードは削除されます。再度申請される同名のユーザーロックは、別のロックとなり、以前のユーザーロックとは無関係です。
適用対象
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供しています。
構文
DBMS_LOCK.ALLOCATE_UNIQUE_AUTONOMOUS (
lockname IN VARCHAR2,
lockhandle OUT VARCHAR2,
expiration_secs IN INTEGER DEFAULT 864000);
パラメータの説明
| パラメータ | 説明 |
|---|---|
| lockname | ロック名。ORA$ で始まらないように注意してください。 |
| lockhandle | ALLOCATE_UNIQUE_AUTONOMOUS によって生成されたロックハンドルを返します。このハンドルを使用して REQUEST 操作を実行できます。任意のセッションが ALLOCATE_UNIQUE_AUTONOMOUS を使用して同じロック名で取得した Lock Handle はすべて、同一のロックを指します。lockhandle の最大長は VARCHAR2 (128) です。 |
| expiration_secs | ALLOCATE_UNIQUE_AUTONOMOUS によって申請されたロックはすべて、DBMS_LOCK_ALLOCATED テーブルにレコードとして保存されています。expiration_secs はそのレコードの保持時間を指定し、この時間内に対応するロックマッピングはクリーンアップされません。デフォルトのタイムアウト時間は10日間です。ALLOCATE_UNIQUE_AUTONOMOUS は期限切れのロックを自動的にクリーンアップするため、手動で DBMS_LOCK_ALLOCATED テーブルのデータを削除する必要はありません。 |
エラーメッセージ
エラーメッセージは以下のとおりです: 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_AUTONOMOUS(lockname => my_lockname,lockhandle => my_lockhandle);
END;/
Query OK, 1 row affected