Oracle

如何確保在 Oracle 中只執行一個過程的一個副本?

  • September 13, 2012

我們需要確保在 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;

引用自:https://dba.stackexchange.com/questions/24269