Sto avendo qualche difficoltà con MySQL e la restituzione di una riga univoca in un thread. Lo voglio in modo che il thread cercherà una riga dalla tabella in cui il bit (vedi sotto) è falso e viene restituita solo una riga. Ma non voglio che gli altri thread restituiscano lo stesso risultato se ci fosse qualche condizione di competizione in cui lo stesso risultato viene restituito al thread; perché il thread eseguirà molta elaborazione dalla parte posteriore di questo risultato e non voglio la duplicazione.
Sfondo: Ho un database MySQL che contiene 3 colonne (id, text, bit). L'ID viene incrementato automaticamente. Ho un'applicazione Ruby multi-thread che legge, aggiorna e inserisce righe nella tabella.
Lo pseudo codice per il thread è il seguente:
select a row from the table where the bit is false
do some processing with the text returned from that row
insert more rows with bit set to false
Ho provato un semplice test con uno script multi-thread che utilizza quanto segue:
SELECT id, text FROM table WHERE bit =FALSE LIMIT 1 FOR UPDATE
Ma ogni thread restituisce la stessa riga. Ho disabilitato l'autocommit secondo la raccomandazione. Poiché sto omettendo qualsiasi commit, mi aspetto che gli altri thread abbiano un risultato diverso poiché la riga è bloccata.
Mi manca qualcosa o dovrei guardare usando un altro metodo?