ORACLE—009:存儲過程加鎖


最近碰到一種情況,需要限制某個存儲過程只能有一個進程在執行,上一個執行完畢后下一個再執行。也就是類似與程序開發中的線程同步問題。

匯總一個下,可以通過如下方法來實現。

1、設置一個變量,或者表中的某個字段為標識位,執行時設置為某個值,執行完后再設置為原來的值。

這種方式的要求設置標識位的地方和判斷這個標識位的地方間隔時間不能太長,否則還是達不到要求。

2、使用行鎖來實現。

比如建一個表t_test,插入幾條數據。 在存儲過程開始的地方

select s.id
 
into v_sn
 
from t_test s for update;

v_sn-是定義的變量,因為在存儲過程中直接select for update這種形式的話,會編譯錯誤,所以需要加上into。

然后在存儲過程結束時,commit或者rollback。當然為了更保險,可使用異常捕獲。

當然為了防止死鎖,可以在for update后加上wait 時間。這樣到了這個時間這個存儲過程會報異常並結束,防止長時間鎖住。

具體腳本如下:

create or replace procedure test_pro  is
    v_sn varchar2;
  begin
      
    select s.id 
    into v_sn
    from t_test s for update wait 10;--10s
    
    --自己的執行腳本
    
    commit;--或者rollback;
    
    EXCEPTION
      WHEN OTHERS THEN
        BEGIN
          ROLLBACK;
        END;
end test_pro;

這樣可以實現一般的阻塞存儲過程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM