我有一个通过存储过程被多个订单处理器访问的订单队列。每个处理器都会传入一个唯一的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