我有一个订单队列,由多个订单处理器通过存储过程访问。每个处理器都传递一个唯一的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
UPDATE
语句中使用UPDLOCK
提示是否会在读取要更新的行时强制使用更新锁(而不是共享锁)?换句话说,如果你不使用UPDLOCK
,是否可能存在竞争条件并导致两个更新语句选择相同的行? - Nelson Rothermel