Heim > Datenbank > MySQL-Tutorial > Wie löst man eine SQL Server-Race-Bedingung in einer Auftragsverarbeitungswarteschlange?

Wie löst man eine SQL Server-Race-Bedingung in einer Auftragsverarbeitungswarteschlange?

Susan Sarandon
Freigeben: 2025-01-18 01:26:12
Original
709 Leute haben es durchsucht

How to Resolve a SQL Server Race Condition in an Order Processing Queue?

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>
Nach dem Login kopieren

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 SELECTErklä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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage