簡體   English   中英

在快照隔離模式下無法使用READPAST

[英]Cannot use READPAST in snapshot isolation mode

我有一個從多個線程調用的進程,它執行以下操作:

  1. 開始交易
  2. 通過查找下一行IsProcessed=0並使用提示(UPDLOCK, HOLDLOCK, READPAST)從工作表中選擇工作單元
  3. 處理工作單元(C#和SQL存儲過程)
  4. 提交交易

這樣做的想法是,一個線程進入池中進行“下一步”工作,並對其進行處理,並且鎖定在那里以確保單個工作不會被處理兩次。 (順序無關緊要)。

這幾個月一直都很好。 直到今天,當我碰巧意識到盡管啟用快照隔離並使其成為數據庫級別的默認值時,實際的事務創建代碼卻手動設置了“ReadCommitted”的隔離級別。

我正式將其更改為“快照”,當然立即收到以下消息:

您只能在READ COMMITTED或REPEATABLE READ中指定READPAST鎖

鎖定行的主要原因是“標記行”,以便在提交應用標記的事務時刪除“標記”並且鎖定似乎是執行此操作的最佳方式,因為這除非通過這些線程,否則不會讀取表。 如果我使用IsProcessed標志作為鎖,那么我可能需要先進行更新,然后選擇剛剛更新的行,但我需要使用NOLOCK標志來知道是否有其他線程設置了在一排上的標志。

所有聽起來都有點亂。 最簡單的選擇是完全放棄快照隔離模式,但步驟#3的設計需要它。

關於解決這個問題的最佳方法有什么好主意嗎?

將特定事務的隔離級別更改為默認讀取提交之外的其他內容(在您的情況下,您已默認在快照模式下執行操作)。 然后,您可以在快照中將其他工作留在數據庫中,但代碼中的此特定工作流將不是快照。

暫無
暫無

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

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