我有一个订单队列,多个订单处理器通过存储过程访问该队列。每个处理器传入一个唯一 ID,用于锁定接下来的 20 个订单以供自己使用。然后存储过程将这些记录返回给订单处理器以进行操作。
在某些情况下,多个处理器能够检索相同的“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