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