ORACLE—009:儲存過程加鎖
阿新 • • 發佈:2022-02-13
最近碰到一種情況,需要限制某個儲存過程只能有一個程序在執行,上一個執行完畢後下一個再執行。也就是類似與程式開發中的執行緒同步問題。
彙總一個下,可以通過如下方法來實現。
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;
這樣可以實現一般的阻塞儲存過程。
好的程式碼像粥一樣,都是用時間熬出來的