[英]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_getapplock
和sp_releaseapplock
。
這將強制執行“單線程”執行。
並且,要中止其他調用,請設置@LockTimeout=0
,因此,如果結果代碼不為零,則您需要中止當前的調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.