|
スポンサード リンク
ユーザー・ロックを取得するには、DBMS_LOCKパッケージを使用します。
DBMS_LOCKパッケージは、ORACLEのロック機能と同等なので、デッドロックの検出などOracleのロック機能を全て備えています。
DBMS_LOCKパッケージの主なプロシージャまたはファンクション
ALLOCATE_UNIQUE(
ロック名,
ロックID); |
ALLOCATE_UNIQUEプロシージャは、指定したロック名のロックIDを取得し返します。 |
REQUEST( ロックID,
ロックモード,
タイムアウト,
解放フラグ
); |
REQUESTファンクションは、指定したロックIDのロックを取得します。
ロックモードには、定数「X_MODE 」または数値「6」を指定します。
タイムアウトには、ロック取得を待機する最大時間を秒数で指定します。
解放フラグには、TRUEを指定するとコミットまたはロールバックでロックが解放されます。
ファンクションの戻り値は以下になります。
0 : 成功
1 : タイムアウト
2 : デッドロック
3 : パラメータエラー
4 : 指定されたロックをすでに所有している。
5 : 不正なロックID
|
RELEASE( ロックID ) |
RELEASEファンクションは、指定したロックIDのロックを明示的に解放します。
ファンクションの戻り値は以下になります。 0 : 成功
3 : パラメータエラー
4 : 指定されたロックは所有してない。
5 : 不正なロックID |
例1) ロック名「TEST_LOCK」でロック取得〜解放まで
|
declare
lock_id varchar2(128);
status integer;
begin
-- ロック名「TEST_LOCK」でロックIDを取得
dbms_lock.allocate_unique('TEST_LOCK',lock_id);
-- タイムアウト30秒でロックを要求する。
status:=dbms_lock.request(lock_id,6,30,true);
-- ロックを解放する。
status:=dbms_lock.release(lock_id);
end;
|
スポンサード リンク
|