Tengo una cola de pedidos a la que acceden varios procesadores de órdenes a través de un procedimiento almacenado. Cada procesador transfiere una identificación única que se utiliza para bloquear las siguientes 20 órdenes para su propio uso. El procedimiento almacenado luego devuelve estos registros al procesador de la orden sobre la que se actuará.SQL Server Process Queue Condición de carrera
Existen casos en que procesadores múltiples pueden recuperar el mismo registro 'OrderTable' en cuyo punto intentan operarlo simultáneamente. Esto, en última instancia, da lugar a errores lanzados más adelante en el proceso.
Mi siguiente línea de acción es permitir que cada procesador tome todas las órdenes disponibles y simplemente haga un ciclo completo de los procesadores, pero esperaba simplemente hacer esta sección de código seguro y permitir a los procesadores tomar registros cuando lo deseen.
Explicitamente: cualquier idea de por qué estoy experimentando esta condición de carrera y cómo puedo resolver el problema.
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: Es evidente que él quiere saber cómo para volver a escribir este procedimiento almacenado para que no resulte en que dos procesadores procesen los mismos registros. – Welbog