Ich muss eine MsSql-Datenbanktabelle und weitere 8 (identische) Prozesse haben, die parallel auf die gleiche Tabelle zugreifen - eine Auswahl top n machen, diese n Zeilen verarbeiten und a aktualisieren Spalte dieser Zeilen. Das Problem ist, dass ich jede Zeile nur einmal auswählen und verarbeiten muss. Das heißt, wenn ein Prozess in die Datenbank gelangt und die obersten n Zeilen ausgewählt hat, sollte er beim Blockieren des zweiten Prozesses diese Zeilen finden und die Zeilen von n bis 2 * n Zeilen auswählen, und so weiter ...Entsperrte Zeilen in einer "select top n" -Abfrage zurückgeben
Ist es möglich, einige Zeilen zu sperren, wenn Sie sie auswählen, und wenn jemand oben n Zeilen anfordert, die gesperrt sind, um die nächsten Zeilen zurückzugeben und nicht auf die gesperrten zu warten? Scheint wie eine Totale, aber ...
Eine andere Sache, die ich dachte - vielleicht nicht so elegant, aber klingt einfach und sicher, ist in der Datenbank einen Zähler für die Instanzen zu haben, die Selects auf diesem Tisch gemacht. Die erste Instanz, die kommt, inkrementiert den Zähler und wählt top n aus, der nächste inkrementiert den Zähler und wählt Zeilen von n * (i-1) bis n * i und so weiter ...
Hört sich an Wie eine gute Idee? Hast du bessere Vorschläge? Jeder Gedanke wird sehr geschätzt!
Danke für Ihre Zeit.
Es klingt wie Sie eine Tabelle als Warteschlange verwenden? Sie könnten [diesen Artikel] finden (http: // rusanu.com/2010/03/26/using-tables-as-queues /) von [Remus Rusanu] (http://stackoverflow.com/users/105929/remus-rusanu) nützlich. –
Danke für den Link. Es war interessant darüber zu wissen, aber da ich die Zeilen behalten muss, nachdem ich sie ausgewählt habe (das Löschen ist keine Option), ist das für meinen Fall nicht wirklich anwendbar. – Diana
Sie könnten eine "verarbeitete" Bitspalte haben und ein "UPDATE" für ein "DELETE" möglicherweise ersetzen. Wenn Sie sich entscheiden, eine Gegenlösung [diese Antwort] (http://stackoverflow.com/questions/3453411/sql-server-auto-incrementation-that-allows-update-statements/3462957#3462957) zu verwenden, könnte helfen. –