最近碰到一種情況,需要限制某個存儲過程只能有一個進程在執行,上一個執行完畢後下一個再執行。也就是類似與程序開發中的線程同步問題。
匯總一個下,可以通過如下方法來實現。
1、設置一個變量,或者表中的某個字段為標識位,執行時設置為某個值,執行完後再設置為原來的值。
這種方式的要求設置標識位的地方和判斷這個標識位的地方間隔時間不能太長,否則還是達不到要求。
2、使用行鎖來實現。
比如建一個表t_test,插入幾條數據。 在存儲過程開始的地方
select s.id into v_sn from t_test s for update;
然後在存儲過程結束時,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;
這樣可以實現一般的阻塞存儲過程。