这个包的使用简单研究了一下,是这样:
名称 类型 描述
ALLOCATE_UNIQUE Procedure 创建锁(如果此锁尚未建立)或者获得锁的标识符(如果此锁已经建立).
REQUEST Function 请求锁.
CONVERT Function 转换锁的状态.
RELEASE Function 释放锁.
SLEEP Procedure 让一个存储过程睡上指定的时间.
使用的大概方式是这样的:
1 先用ALLOCATE_UNIQUE建立新锁,并获得锁的标识符,如果锁已经存在,直接得到标识符。
2 通过锁的标识符,用REQUEST方法对锁发出请求,会获得状态值,可以通过这个状态值判定锁的状态,如锁是否可用、是否正在被其他会话使用等,以此来决定程序如何运行。
3 当存储过程结束时,用RELEASE方法显示的将锁释放掉。
下面展示了一下基本的使用:
declare
v_result number;
v_lockhandle varchar2(128);
begin
--allocate a lock named "foo_lock",and get identifier
dbms_lock.allocate_unique('foo_lock', v_lockhandle);
--request for this lock,then get request result
v_result:=dbms_lock.request(v_lockhandle,6,10,true);
if(v_result = 0) then
--have gain the lock successfully,then some operation can startup
--.......
--some operation here
--.......
--release the lock after operation has been finished
v_result:=dbms_lock.release(v_lockhandle);
else
--not get the lock,print out the reason
dbms_output.put_line(case when v_result=0 then 'Lock allocated'
when v_result=1 then 'Timeout'
when v_result=2 then 'Deadlock'
when v_result=3 then 'Parameter Error'
when v_result=4 then 'Already owned'
when v_result=5 then 'Illegal Lock Handle'
end);
end if;
end;
/
一个会话(Session)获得一个锁之后,应该显式的用RELEASE将其释放,否则其他会话将不能继续使用,其他会话调用REQUEST方法时,如果没有设置TimeOut参数,将一直等待下去,直到拥有锁的会话释放掉锁或者断掉,它才能获得此锁。