SQL Server-Prozesswarteschlangenbedingung
Habe ich eine order-Warteschlange, die für den Zugriff durch mehrere um Prozessoren über eine gespeicherte Prozedur. Jeder Prozessor geht in eine eindeutige ID, die verwendet wird, um zu sperren, die nächsten 20 Bestellungen für den eigenen Gebrauch. Die gespeicherte Prozedur gibt dann auch diese Einträge der Reihenfolge Prozessor eingewirkt werden.
Gibt es Fälle, wo mehrere Prozessoren sind in der Lage, zum abrufen der gleichen 'OrderTable' record, an welcher Stelle Sie versuchen gleichzeitig zu betreiben. Dies resultiert letztlich in Fehlern geworfen werden, die später im Prozess.
Meine nächste Kurs der Aktion ist es, jeden Prozessor greifen alle mögliche Aufträge und nur round-robin-Prozessoren, aber ich hatte gehofft, einfach nur in diesem Abschnitt von code, thread-sicher und ermöglichen die Prozessoren zu greifen Aufzeichnungen, Wann immer Sie möchten.
So Explizit - keine Ahnung warum ich bin in diesem race condition und wie ich das problem lösen kann.
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
InformationsquelleAutor der Frage William Edmondson | 2009-06-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Edit:
Habe ich gegoogelt, um zu überprüfen meine Antwort: "Die Verarbeitung von Daten Warteschlangen in SQL Server mit READPAST-und UPDLOCK". Es ist Jahre her, seit ich darüber gelesen und spielte mit dieser Lösung.
Original:
Wenn Sie die READPAST-Hinweis, dann gesperrte Zeilen werden übersprungen. Sie haben ROWLOCK verwendet, so sollten Sie vermeiden, bei der Sperre. Sie müssen auch UPDLOCK, wie ich herausgefunden habe.
Damit Prozess 1 sperrt, 20 Zeilen, Prozess 2 wird die nächsten 20 -, Prozess dauert 3 Zeilen 41 bis 60 usw.
Kann das update auch wie folgt geschrieben werden:
Aktualisieren, Okt 2011
Diese kann getan werden, mehr aus mit der OUTPUT-Klausel, wenn Sie benötigen ein SELECT und ein UPDATE in einem Rutsch.
InformationsquelleAutor der Antwort gbn
Können Sie die Service Broker verwenden. Sie können auch verwenden sp_getapplock zu serialisieren Zugang zu Ihren Reihen - das wird beseitigen race conditions:
"Unterstützung von Parallelität, indem Sie Ihre eigenen Sperren (Mutexs in SQL)"
http://sqlblogcasts.com/blogs/tonyrogerson/archive/2006/06/30/855.aspx
InformationsquelleAutor der Antwort A-K