我有一個存儲過程,我想確保它不能同時執行。我應該避免使用sp_getAppLock嗎?
我的(多線程)應用程序不通過這個存儲過程基礎表上的所有必要的工作。因此,鎖定表本身是一個不必要的劇烈行動,所以當我發現sp_GetAppLock
時,它基本上強制執行臨界區,這聽起來很理想。
我的計劃是包住存儲過程中的事務,並建立與spGetAppLock
事務範圍。代碼已成功編寫和測試。
代碼現在已經提出了檢討,我被告知,我不應該調用這個函數。然而,當問一個明顯的問題「爲什麼不?」時,我得到的唯一理由是非常主觀的,任何形式的鎖定都是複雜的。
我不一定買這個,但我想知道是否有任何人有任何客觀爲什麼我應該避免這個結構。就像我說的那樣,根據我的情況,關鍵部分聽起來對我來說是理想的方法。
TIA, 皮特
進一步信息:應用程序坐在與2個線程T1和T2的這個頂部。每個線程正在等待不同的消息M1和M2。涉及的業務邏輯表示,只有在M1和M2都抵達後才能進行處理。存儲過程記錄Mx到達(插入),然後檢查My是否存在(select)。內置鎖定很好,以確保插入順序發生。但是選擇也需要連續發生,我認爲我需要做一些超越內置功能的東西。
爲了清楚起見,我希望「處理」只發生一次。所以我不能讓存儲過程返回誤報或漏報。我很擔心,如果存儲過程非常快速地連續運行兩次,那麼兩個「選擇」都可能返回表示適合執行處理的數據。
通常情況下,sp_GetAppLock是最後的手段,當不應該同時訪問項目(可能導致死鎖)時,如果死鎖是您的問題,請嘗試降低隔離級別(需要進行測試以確保較低的隔離級別可接受)。通常閱讀承諾是最好的。 – Farfarak
您能否確認存儲過程僅由T1和T2調用? – Farfarak
是的,這是正確的。 – PeteH