Behandeln von Race Conditions in der Auftragsverarbeitungswarteschlange von SQL Server
Herausforderung: Gleichzeitige Auftragsverarbeiter, die über eine gespeicherte Prozedur auf eine Auftragswarteschlange zugreifen, stoßen auf Rennbedingungen. Dies führt zu doppelten Bestellabrufen und Verarbeitungsfehlern. Die aktuelle gespeicherte Prozedur versucht, dies zu mildern, indem sie 20 Bestellungen gleichzeitig sperrt, aber das erweist sich als unzureichend.
Problematische Abfrage:
Die ursprüngliche Abfrage verwendet einen zweistufigen Prozess (UPDATE gefolgt von SELECT) mit Zeilensperre, wodurch ein Fenster für Race-Bedingungen erstellt wird:
<code class="language-sql">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</code>
Grundursache: Die UPDATE-Anweisung versucht, Zeilen zu sperren, nachdem die SELECT-Anweisung sie identifiziert hat. In einer Umgebung mit mehreren Prozessoren ermöglicht dieser Zeitunterschied, dass mehrere Prozessoren dieselben Befehle erhalten.
Effektive Lösung: Durch die Verwendung der READPAST
- und UPDLOCK
-Hinweise innerhalb einer einzigen UPDATE
-Anweisung wird die Race-Bedingung behoben. READPAST
ermöglicht dem SELECT-Teil des UPDATE, gesperrte Zeilen zu umgehen, während UPDLOCK
sicherstellt, dass nur entsperrte Zeilen aktualisiert werden.
Überarbeitete Abfrage:
Dieser optimierte Ansatz eliminiert die Race-Bedingung:
<code class="language-sql">UPDATE TOP (20) OrderTable SET ProcessorID = @PROCID FROM OrderTable WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0</code>
Diese überarbeitete Abfrage ordnet Aufträge effizient und zuverlässig den Bearbeitern zu und verhindert so Doppelbearbeitungen.
Das obige ist der detaillierte Inhalt vonWie kann ich Race Conditions in der Auftragsverarbeitungswarteschlange von SQL Server verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!