2012-04-05 11 views
0

Es gibt eine Tabelle mit mehr als 100.000 Datensätzen, die ein bestimmtes interessierendes Kriterium erfüllen. Ein Job wird ausgeführt, um 1000 Datensätze gleichzeitig aus diesem Satz abzurufen, und führt für jeden Datensatz eine Operation aus. Es gibt andere Prozesse, die möglicherweise die Datensätze in dieser Tabelle ändern, die den Satz von Interesse beeinflussen können. Aufgrund dieser Änderungen werden sich die Datensätze, die beim Start des Jobs in den Seiten enthalten sein sollen, ständig ändern. Dies führt dazu, dass bestimmte Datensätze entweder verloren gehen oder bestimmte Datensätze mehr als einmal verarbeitet werden.Wie verarbeiten wir Datensätze in einer großen Tabelle mit Paging, wobei sich der Status der Datensätze ändert und sich dadurch der Inhalt einer bestimmten Seite ändert?

Obwohl ich verstehe, dass das System so konzipiert sein sollte, um diese Situation zu vermeiden, ist das Re-Design des Systems zu diesem Zeitpunkt keine Wahl. Also habe ich mich gefragt, ob dies ein allgemeines Szenario ist und wenn ja, welche Art von Lösungsmustern gibt es? Ich habe versucht zu googeln, konnte aber keine sinnvollen Treffer erzielen.

danke.

Antwort

1

Ein Ansatz besteht darin, die Datenbank im Leerlauf zu klonen und dann die Kopie im Job zu bearbeiten. Die Daten werden etwas veraltet sein, aber wenn Ihre Datenbank ständig aktualisiert wird, während Sie versuchen, auf den gesamten Inhalt zuzugreifen, ist es nicht möglich, "aktuell" zu sein.

+0

Vielen Dank für die Antwort, Vinnie Falco. Da die Tabelle sehr groß ist und potentiell ständig aktualisiert werden kann, bedeutet das, dass wir die Tabelle exklusiv sperren und einen Schnappschuss machen müssen. Dies ist an dieser Stelle ein wenig undurchführbar. – Vikdor

1

Vorausgesetzt, dass Sie Ihre 1000 Datensätze erfassen und Berechnungen darauf durchführen, ist das kein zeitaufwendiger Prozess, in den Sie Ihren Code in eine Transaktion integrieren könnten. Das bedeutet natürlich, dass andere Verbindungen die Tabelle von Interesse nicht gleichzeitig ändern können. Sie müssen im Grunde warten, bis die Transaktion abgeschlossen ist, bevor ihre update/insert-Anweisungen ausgeführt werden. Wenn Ihr Code nicht viel Zeit in Anspruch nimmt und die Timeout-Zeit der anderen Verbindungen angemessen ist, ist dies eine mögliche Lösung.

+0

Danke für die Antwort, Dan. Es scheint, dass die Datensätze exklusiv gesperrt werden müssen. – Vikdor

Verwandte Themen