Oracle
如何確保在 Oracle 中只執行一個過程的一個副本?
我們需要確保在 Oracle 中只有一個特定過程的副本正在執行。如果它已經在執行並且使用者嘗試打開另一個,那麼它應該會出錯。
這樣做的最佳方法是什麼?
您可以
DBMS_LOCK
使用獨占鎖來執行此操作。請參閱以下過程:
CREATE OR REPLACE PROCEDURE myproc IS lockhandle VARCHAR2(128); retcode NUMBER; BEGIN DBMS_LOCK.ALLOCATE_UNIQUE('myproclock',lockhandle); retcode:=DBMS_LOCK.REQUEST(lockhandle,timeout=>0, lockmode=>DBMS_LOCK.x_mode); IF retcode<>0 THEN raise_application_error(-20000,'myproc is already running'); END IF; /* sleep so that we can test with a 2nd execution */ DBMS_LOCK.sleep(1000); retcode:=DBMS_LOCK.RELEASE(lockhandle); END myproc; /
測試(會話 1):
SQL> BEGIN 2 myproc(); 3 END; 4 /
(顯然返回時
DBMS_LOCK.sleep()
返回)。測試(會話 2):
SQL> BEGIN 2 myproc(); 3 END; 4 / BEGIN * ERROR at line 1: ORA-20000: myproc is already running ORA-06512: at "PHIL.MYPROC", line 12 ORA-06512: at line 2 SQL>
顯然你需要
GRANT EXECUTE ON DBMS_LOCK TO YOURUSER;
。