Potrzebuję mieć tabelę bazy danych MsSql i kolejne 8 (identyczne) procesy, które uzyskują dostęp do tej samej tabeli równolegle - wybierając górny n, przetwarzając te n wierszy i aktualizując kolumna tych wierszy. Problem polega na tym, że muszę wybrać i przetworzyć każdy wiersz tylko raz. Oznacza to, że jeśli jeden proces dotarł do bazy danych i wybrał górne n wierszy, gdy nadejdzie drugi proces, powinien znaleźć te wiersze zablokowane i wybrać wiersze od n do 2 * n wierszy, i tak dalej ...Zwróć odblokowane wiersze w zapytaniu "wybierz najlepsze n".
Czy możliwe jest umieszczenie blokady w niektórych wierszach, gdy je wybierzesz, a kiedy ktoś zażąda górnych n wierszy, które są zablokowane, aby zwrócić kolejne wiersze i nie czekać na zablokowane? Wydaje się, jakby to był długi strzał, ale ...
Inną rzeczą, o której myślałem - może nie tak elegancko, ale brzmi prosto i bezpiecznie, jest posiadanie w bazie danych licznika dla instancji, które dokonały wyboru na tym stole. Pierwsza otrzymana instancja zwiększy licznik i wybierze górę n, następny zwiększy licznik i wybierze wiersze od n * (i-1) do n * i, i tak dalej ...
Czy ten dźwięk jak dobra ideea? Czy masz jakieś lepsze sugestie? Każda myśl jest bardzo ceniona!
Dzięki za poświęcony czas.
Wygląda na to, że używasz tabeli jako kolejki? Możesz znaleźć [ten artykuł] (http: // rusanu.com/2010/03/26/using-tables-as-queues /) przez [Remus Rusanu] (http://stackoverflow.com/users/105929/remus-rusanu) przydatne. –
Dzięki za link. Ciekawie było o tym wiedzieć, ale ponieważ muszę zachować wiersze po ich wybraniu (usunięcie ich nie jest opcją), to nie jest to w pełni zgodne z moim przypadkiem. – Diana
Możesz mieć kolumnę 'przetworzonych' bitów i ewentualnie zastąpić' UPDATE' dla 'DELETE'. Jeśli zdecydujesz się użyć rozwiązania licznika [ta odpowiedź] (http://stackoverflow.com/questions/3453411/sql-server-auto-incrementation-that-allows-update-statements/3462957#3462957) może pomóc. –