Wygląda na to, że potrzebujesz jakiejś formy znacznika, aby zidentyfikować wiersze jako „używane”, aby inne instancje nie przetwarzały tych samych danych; to, czy używasz typu logicznego, czy typu daty, jest nieistotne, w jakiś sposób musisz oznaczyć używane wiersze.
Możesz to zrobić za pośrednictwem dyspozytora, procesu lub wątku z wyłącznym dostępem do Twojej tabeli, a jedynym zadaniem jest wybieranie wierszy i przekazywanie ich do innych procesów do pracy. Nawet wtedy dyspozytor będzie musiał wiedzieć, jak daleko ma dane, więc wrócisz do tego samego problemu.
Innym sposobem jest użycie pola do wskazania, że wiersz jest w użyciu (jak powiedziałeś w swoim pytaniu). Każdy proces aktualizuje blok wierszy o unikalnym identyfikatorze, wykonywany wewnątrz transakcji w celu zablokowania tabeli; Użyłbym numeru połączenia zwróconego przez CONNECTION_ID()
aby je oznaczyć, wiesz, że jest wyjątkowy.
Po UPDATE ... WHERE connection_id IS NULL
(z zastosowanym limitem) transakcja jest zakończona proces może SELECT ... WHERE connection_id = CONNECTION_ID()
aby uzyskać ich wiersze do przetworzenia.
Po zakończeniu pracy cały cykl zaczyna się od nowa, aby zaznaczyć następny zestaw wierszy, aż wszystkie zostaną przetworzone.