Frage

Es gibt kleines System, in dem eine Datenbanktabelle als Warteschlange auf MSSQL 2005. Eine Reihe von Anwendungen auf diese Tabelle zu schreiben, und eine Anwendung ist das Lesen und die Verarbeitung in einer FIFO-Weise.

muss ich es ein wenig weiter fortgeschritten zu können, machen ein verteiltes System schaffen, in dem mehrere Verarbeitungs Anwendung ausgeführt werden kann. Das Ergebnis sollte sein, dass 2-10 Verarbeitungsanwendung sollte in der Lage zu laufen und sie sollten sich gegenseitig bei der Arbeit nicht stören.

Meine Idee ist es, die Queue-Tabelle mit einer Reihe zeigt, dass ein Prozess arbeitet bereits auf ihn zu verlängern. Die Verarbeitungsanwendung wird zuerst die Tabelle aktualisieren, damit idetifyer ist, und dann für die aktualisierten Datensätze fragt.

So etwas wie folgt aus:

start transaction
update top(10) queue set processing = 'myid' where processing is null
select * from processing where processing = 'myid'
end transaction

Nach der Verarbeitung setzt die Verarbeitung Spalte der Tabelle auf etwas anderes, wie ‚erledigt‘, oder was auch immer.

Ich habe drei Fragen zu diesem Ansatz.

Erstens: Kann diese Arbeit in dieser Form

Zweitens: Wenn es funktioniert, ist es effektiv? Haben Sie noch andere Ideen haben, eine solche Verteilung zu erstellen?

Drittens: In der Verriegelungs MSSQL ist Reihe basiert, aber nachdem eine Menge von Zeilen gesperrt ist, wird die Sperre für die gesamte Tabelle erweitert. So ist die zweite Anwendung kann nicht darauf zugreifen, bis die erste Anwendung entbindet die Transaktion nicht. Wie groß kann die Auswahl (oben x) sein, um nicht die gesamte Tabelle zu sperren, nur Zeilensperren erstellen?

War es hilfreich?

Lösung

Das wird funktionieren, aber Sie werden wahrscheinlich finden Sie in Sperrung oder Deadlocks werden laufen, wo mehrere Prozesse versuchen und lesen / aktualisieren, um die gleichen Daten. Ich schrieb ein Verfahren für einen unserer Systeme genau dies zu tun, die einige interessante Verriegelungs Semantik verwendet diese Art der Sache, um sicherzustellen, läuft ohne Blockierung oder Deadlocks, beschrieben hier .

Andere Tipps

Dieser Ansatz scheint mir vernünftig, und ist ähnlich, die ich in der Vergangenheit verwendet haben -. Erfolgreich

Außerdem wird die Zeile / Tabelle nur gesperrt werden, während die Aktualisierung und Auswahl-Operationen stattfinden, so dass ich bezweifle, dass die Reihe vs Tabelle Frage ist wirklich ein wichtiger Aspekt.

Wenn der Verarbeitungsaufwand für Ihre Anwendung ist so gering, unbedeutend ist, würde ich den „top“ Wert niedrig halten -. Vielleicht nur 1. Natürlich, die auf den Details Ihrer Anwendung hängt ganz

Nachdem alles gesagt, dass ich bin kein DBA, und so wird es auch in irgendwelchen mehr Experten Antworten interessiert sein

In Bezug auf Ihre Frage zu sperren. Sie können einen Sperr Hinweis verwenden, um es zu zwingen nur Zeilen sperren

update mytable with (rowlock) set x=y where a=b

Das größte Problem bei diesem Ansatz ist, dass Sie die Anzahl der ‚Updates‘ erhöhen, um den Tisch. Versuchen Sie dies mit nur einem Prozess raubend (Update + löschen) und andere Daten in der Tabelle einfügen, und Sie werden feststellen, dass bei rund einer Million Datensätze, es beginnt zu bröckeln.

Ich würde eher einen Verbraucher für die DB habe und Nachrichtenwarteschlangen verwenden, um die Verarbeitung von Daten an anderen Verbrauchern zu liefern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top