Heim >Datenbank >MySQL-Tutorial >Wie kann ich eine SQL Server-Race-Bedingung in der Auftragsverarbeitung aufgrund des Abrufs doppelter Datensätze beheben?

Wie kann ich eine SQL Server-Race-Bedingung in der Auftragsverarbeitung aufgrund des Abrufs doppelter Datensätze beheben?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-18 01:22:10629Durchsuche

How Can I Resolve a SQL Server Race Condition in Order Processing Due to Duplicate Record Retrieval?

Behandeln von SQL Server Race Conditions bei der Auftragsverarbeitung

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!

Stellungnahme:
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