Behandeln von SQL Server Race Conditions bei der Auftragsverarbeitung
Dieser Artikel befasst sich mit einem häufigen Problem: Mehrere Auftragsverarbeiter stoßen auf Race Conditions, wenn sie über eine gespeicherte Prozedur auf eine Bestellwarteschlange zugreifen. Die gespeicherte Prozedur verwendet eine eindeutige ID, um die nächsten 20 Bestellungen für die Verarbeitung zu sperren. Allerdings kann der gleichzeitige Zugriff dazu führen, dass mehrere Bearbeiter denselben Auftrag beanspruchen, was zu Verarbeitungsfehlern führt.
Die Hauptursache ist die Sichtbarkeit nicht festgeschriebener Transaktionen. Selbst mit ROWLOCK
, das normalerweise den gleichzeitigen Zugriff auf Zeilen verhindert, sind nicht festgeschriebene Änderungen für andere Prozessoren, die auf Sperren prüfen, nicht sichtbar. Dadurch entsteht die Rennbedingung.
Die Lösung besteht darin, die READPAST
- und UPDLOCK
-Hinweise in Ihren SELECT
- und UPDATE
-Anweisungen zu verwenden. READPAST
weist die Datenbank an, gesperrte Zeilen zu umgehen und so Störungen durch nicht festgeschriebene Aktualisierungen zu vermeiden. UPDLOCK
stellt eine exklusive Sperre für aktualisierte Zeilen sicher, bis die Transaktion festgeschrieben wird, und verhindert so, dass andere Prozessoren sie ändern.
Hier ist der verbesserte Code, der diese Hinweise enthält:
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) foo SET ProcessorID = @PROCID FROM OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0 COMMIT TRAN SELECT OrderID, ProcessorID, etc... FROM OrderTable WHERE ProcessorID = @PROCID</code>
Zur Steigerung der Effizienz sollten Sie die Verwendung der OUTPUT
-Klausel in Betracht ziehen. Dadurch werden die Operationen SELECT
und UPDATE
zusammengeführt, die Tabelle aktualisiert und die geänderten Zeilen in einem einzigen Schritt zurückgegeben. Dadurch entfällt die Notwendigkeit einer separaten SELECT
Erklärung.
Das obige ist der detaillierte Inhalt vonWie löst man eine SQL Server-Race-Bedingung in einer Auftragsverarbeitungswarteschlange?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!