我有大約20個相互使用的存儲過程,形成一個樹狀的依賴關係鏈。sp_getapplock用於同步對內存表的併發訪問
但是,存儲過程使用內存表進行緩存,可以從多個不同的客戶端同時調用。
爲防止針對內存表的併發更新/刪除嘗試,我使用了sp_getapplock和SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT ON;
。
我正在使用每個存儲過程獨有的存儲過程參數的散列,但對具有相同參數的同一存儲過程的多個併發調用應生成相同的散列。這就是對同一個存儲過程的併發調用的哈希值的相等性,這些參數的相同參數爲我提供了一個有用的資源名稱來獲取我們的applock。
下面是一個例子:
BEGIN TRANSACTION
EXEC @LOCK_STATUS = sp_getapplock @Resource= [SOME_HASH_OF_PARAMETERS_TO_THE_SP], @LockMode = 'Exclusive';
...some stored proc code...
IF FAILURE
BEGIN
ROLLBACK;
THROW [SOME_ERROR_NUMBER]
END
...some stored proc code...
COMMIT TRANSACTION
儘管這應該阻止任何併發更新或刪除一個的AppLock包裝的一切,我仍然得到錯誤41302:
當前事務嘗試更新記錄自該交易開始以來已更新爲 。交易被中止。 在批處理結束時檢測到不可提交的事務。回滾事務 。
我是否正確使用sp_getapplock?這似乎是我建議的方法應該起作用。
這正是答案。它不能說得比你的回答和例子更清楚。實際上我幾天前終於明白了這一點,所以我知道你的答案是完全正確的。感謝您的迴應。 –
會話鎖定有助於(https://msdn.microsoft.com/en-us/library/ms189823.aspx,LockOwner =「Session」),特別是在快照模式下。首先獲取會話鎖並開始一個事務。這似乎是唯一正確的方法。 – Martijn