Sembra che tu abbia bisogno di una qualche forma di indicatore per identificare le righe come "in uso" in modo che le altre istanze non elaborino gli stessi dati; se utilizzi un tipo booleano o data è irrilevante, in qualche modo devi contrassegnare le righe in uso.
Puoi farlo tramite un dispatcher, un processo o un thread con accesso esclusivo alla tua tabella e il cui unico compito è selezionare le righe e passarle ad altri processi su cui lavorare. Anche in questo caso il mittente dovrà sapere fino a che punto ha ottenuto i dati in modo da tornare allo stesso problema.
Un altro modo è usare un campo per indicare che la riga è in uso (come hai detto nella tua domanda). Ogni processo aggiorna un blocco di righe con un ID univoco, eseguito all'interno di una transazione per bloccare la tabella; Userei il numero di connessione restituito da CONNECTION_ID()
per contrassegnarli, allora sai che è unico.
Dopo UPDATE ... WHERE connection_id IS NULL
(con un limite applicato) la transazione è completa, il processo può SELECT ... WHERE connection_id = CONNECTION_ID()
per ottenere le loro righe per l'elaborazione.
Quando hanno terminato il loro lavoro, tutto il ciclo ricomincia per segnare la serie di righe successiva fino a quando non sono state lavorate tutte.