У меня есть очередь заказов, к которой обращаются несколько процессоров заказов через хранимую процедуру. Каждый процессор передает уникальный идентификатор, который используется для блокировки следующих 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