Ich habe eine Auftragswarteschlange, auf die mehrere Auftragsprozessoren über eine gespeicherte Prozedur zugreifen. Jeder Prozessor übergibt eine eindeutige ID, mit der die nächsten 20 Aufträge für die eigene Verwendung gesperrt werden. Die gespeicherte Prozedur gibt diese Datensätze dann an den Auftragsprozessor zurück, der bearbeitet werden soll.SQL Server Prozess Queue Race-Bedingung
Es gibt Fälle, in denen mehrere Prozessoren in der Lage sind, denselben 'OrderTable'-Datensatz abzurufen, zu welchem Zeitpunkt sie versuchen, gleichzeitig daran zu arbeiten. Dies führt letztendlich zu Fehlern, die später im Prozess ausgelöst werden.
Meine nächste Vorgehensweise besteht darin, dass jeder Prozessor alle verfügbaren Befehle ergreift und nur die Prozessoren abrundet, aber ich hoffte, diesen Teil des Code-Threads sicher zu machen und es den Prozessoren zu ermöglichen, Datensätze zu erfassen, wann immer sie möchten.
Also Explizit - Jede Idee, warum ich diese Race Condition erfahre und wie ich das Problem lösen kann.
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: Offensichtlich will er wissen, wie um diese gespeicherte Prozedur neu zu schreiben, so dass dies nicht dazu führt, dass zwei Prozessoren denselben Datensatz verarbeiten. – Welbog