我有一個通過存儲過程被多個訂單處理器訪問的訂單隊列。每個處理器都會傳入一個唯一的ID,用於鎖定下一個20個訂單以供自己使用。存儲過程然後將這些記錄返回給訂單處理器以執行操作。SQL Server進程隊列爭用條件
有些情況下,多處理器能夠檢索相同的'OrderTable'記錄,他們試圖同時操作它。這最終導致過程中稍後拋出錯誤。
我的下一步行動是讓每個處理器抓取所有可用的訂單,並循環處理處理器,但我希望簡單地使這部分代碼線程安全,並允許處理器隨時抓取記錄。
如此明確 - 任何想法爲什麼我遇到這種競爭條件,以及我如何解決問題。
BEGIN TRAN
UPDATE OrderTable WITH (ROWLOCK)
SET ProcessorID = @PROCID
WHERE OrderID IN (SELECT TOP (20)
OrderID
FROM OrderTable WITH (ROWLOCK)
WHERE ProcessorID = 0)
COMMIT TRAN
SELECT OrderID, ProcessorID, etc...
FROM OrderTable
WHERE ProcessorID = @PROCID
@Keltex
:很顯然,他想知道如何重寫此存儲過程,以便它不會導致兩個處理器處理相同的記錄。 – Welbog 2009-06-02 14:30:49