簡體   English   中英

避免存儲過程的並發

[英]Avoiding concurrency of Stored Procedures

我有以下場景:

我需要以固定的時間間隔觸發更新過程。 但是某些過程可能會花費比間隔更長的時間。 我想避免對過程的調用堆積(以防萬一要在之前的執行尚未完成之前就開始)。

我的同事建議我在數據庫中創建帶有兩列的附加表:一列為過程名稱,另一列為IsActive列( bit )。 因此,在執行任何過程之前,我都要檢查IsActive的相應值。 如果為1 ,則中止執行。

現在,問題是:

當我執行時,需要將該過程的IsActive值設置為1 ,我嘗試這樣做:

UPDATE ProcActivity SET IsActive = 1 WHERE ProcedureName = 'proc_name'
EXEC proc_name
UPDATE ProcActivity SET IsActive = 0 WHERE ProcedureName = 'proc_name'

但是,SQL正在執行批處理,因此在過程完成之前,值1是不可見的(不提交UPDATE )。

那么,如何提交此UPDATE呢? 我嘗試使用COMMIT ,但是沒有用...我不能使用GO ,因為它包裝在IF語句中...

出於可見性,請勿以這種方式使用事務,除非您想使用額外的提示。 我個人不會這樣做。

如果您希望“僅一個存儲的proc執行電流”,那么我將在存儲過程中考慮sp_getapplocksp_releaseapplock

這將強制執行“單線程”執行。

這里的其他問題表明如何使用它

並且,要中止其他調用,請設置@LockTimeout=0 ,因此,如果結果代碼不為零,則您需要中止當前的調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM