Heim >Datenbank >MySQL-Tutorial >Wie kann ich eine SQL Server-Race-Bedingung in der Auftragsverarbeitung aufgrund des Abrufs doppelter Datensätze beheben?
In Ihrem Auftragsverarbeitungssystem treten Race-Bedingungen auf, da mehrere Prozessoren dieselben Datensätze abrufen. So beheben Sie das Problem:
Das Problem verstehen:
Das Problem ergibt sich aus der Verwendung eines ROWLOCK
Hinweises durch die gespeicherte Prozedur in Kombination mit einer Auswahl aus einer separat gesperrten Ansicht. Dadurch können mehrere Prozessoren denselben Datensatz sperren, was zu Datenbeschädigung führt.
Lösung mit Hinweisen:
Um die Rennbedingung zu beheben, verwenden Sie die Hinweise READPAST
und UPDLOCK
:
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) OrderTable foo SET ProcessorID = @PROCID FROM foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0 COMMIT TRAN SELECT OrderID, ProcessorID, etc... FROM OrderTable WHERE ProcessorID = @PROCID</code>
READPAST
vermeidet gesperrte Zeilen während der Auswahl und gewährleistet so eine kontinuierliche Abfrageausführung. UPDLOCK
gewährleistet die ordnungsgemäße Sperrung während des Updates und verhindert gleichzeitige Änderungen.
Eine effizientere Lösung:
Ein schlankerer Ansatz verwendet die OUTPUT
-Klausel, um die Operationen SELECT
und UPDATE
zu kombinieren:
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) foo OUTPUT OrderID, ProcessorID, etc... SET ProcessorID = @PROCID FROM foo WITH (ROWLOCK, UPDLOCK, READPAST) WHERE ProcessorID = 0 COMMIT TRAN</code>
Dadurch entfällt die Notwendigkeit einer separaten SELECT
Anweisung, was die Effizienz und Codeklarheit verbessert.
Das obige ist der detaillierte Inhalt vonWie kann ich eine SQL Server-Race-Bedingung in der Auftragsverarbeitung aufgrund des Abrufs doppelter Datensätze beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!