Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Race Condition der SQL Server-Prozesswarteschlange

Bearbeiten:

Ich habe gegoogelt, um meine Antwort zu überprüfen:"Verarbeitung von Datenwarteschlangen in SQL Server mit READPAST und UPDLOCK". Es ist Jahre her, seit ich über diese Lösung gelesen und damit gespielt habe.

Original:

Wenn Sie den READPAST-Hinweis verwenden, werden gesperrte Zeilen übersprungen. Sie haben ROWLOCK verwendet, daher sollten Sie eine Sperreneskalation vermeiden. UPDLOCK braucht man auch, wie ich herausgefunden habe.

Prozess 1 sperrt also 20 Zeilen, Prozess 2 nimmt die nächsten 20, Prozess 3 nimmt Zeilen 41 bis 60 usw.

Das Update kann auch so geschrieben werden:

UPDATE TOP (20)
    foo
SET
    ProcessorID = @PROCID
FROM
    OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK)
WHERE
    ProcessorID = 0

Aktualisieren, Oktober 2011

Eleganter geht das mit der OUTPUT-Klausel, wenn man ein SELECT und ein UPDATE auf einmal braucht.