Heim > Datenbank > MySQL-Tutorial > Wie kann ich Race Conditions in der Auftragsverarbeitungswarteschlange von SQL Server verhindern?

Wie kann ich Race Conditions in der Auftragsverarbeitungswarteschlange von SQL Server verhindern?

DDD
Freigeben: 2025-01-18 01:31:10
Original
710 Leute haben es durchsucht

How Can I Prevent Race Conditions in SQL Server's Order Processing Queue?

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

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

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage