项目用到了weblogic集群,导致应用调用存储过程时发生了冲突。
把下面存储过程中的话加到你想要加锁的业务前后即可。
create or replace procedure testp is
LN number;
jcr_lockhandle varchar2(128);
begin
DBMS_LOCK.allocate_unique('Lock', jcr_lockhandle);--针对当前session加锁
LOOP
LN := DBMS_LOCK.request ( jcr_lockhandle, TIMEOUT => 0);
IF LN NOT IN (0, 4)--判断是否被别session锁住
THEN
DBMS_OUTPUT.put_line ('Already run...');
DBMS_LOCK.sleep (2);--已经被人锁住,休眠2秒
ELSE
EXIT;--没有锁,退出轮询
END IF;
END LOOP;
dbms_output.put_line('1'); ----你要加锁的业务逻辑哦
LN := DBMS_LOCK.release ( jcr_lockhandle);--释放资源
end ;