Race Conditions in SQL Server-Bestellwarteschlangen vermeiden
Mehrere Auftragsbearbeiter greifen über eine gespeicherte Prozedur auf eine Auftragswarteschlange zu und rufen jeweils 20 Aufträge ab. Dies kann zu einer Race-Bedingung führen, bei der mehrere Prozessoren denselben Auftrag übernehmen, was zu Verarbeitungsfehlern führt.
Hier ist eine Lösung zur Beseitigung dieses Parallelitätsproblems:
Ein Ansatz verwendet den READPAST
-Hinweis, um gesperrte Zeilen zu umgehen, gekoppelt mit ROWLOCK
, um eine Sperreskalation zu verhindern, und UPDLOCK
für die exklusive Zeilensperrung. Dadurch kann jeder Prozessor einen bestimmten Zeilenstapel sperren (z. B. Prozessor 1 sperrt die Zeilen 1–20, Prozessor 2 sperrt die Zeilen 21–40 usw.).
Die geänderte gespeicherte Prozedur würde so aussehen:
<code class="language-sql">UPDATE TOP (20) foo SET ProcessorID = @PROCID FROM OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0;</code>
Eine andere Methode beinhaltet die Verwendung der OUTPUT
-Klausel. Dadurch werden die Operationen SELECT
und UPDATE
in einer einzigen atomaren Anweisung zusammengefasst, wodurch die sofortige Verfügbarkeit der aktualisierten Zeilen für den Prozessor gewährleistet wird. Dadurch entfällt die Notwendigkeit separater SELECT
- und UPDATE
-Operationen, wodurch Race-Bedingungen vermieden werden.
Das obige ist der detaillierte Inhalt vonWie kann ich Race Conditions bei der Verarbeitung von Bestellungen aus einer SQL Server-Warteschlange verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!