UPDATE
blocca la riga, quindi non è necessario bloccarla prima. Se provi a UPDATE
insiemi di righe sovrapposti contemporaneamente, il secondo UPDATE
attenderà il commit o il rollback della prima transazione.
Il grosso problema con il tuo approccio, a parte il fatto che UPDATE
non ha un LIMIT
clausola - è che più lavoratori cercheranno tutti di afferrare le stesse righe. Ecco cosa succede:
- worker1:filtra la tabella per trovare 200 righe e le blocca
- lavoratore1:avvia l'aggiornamento delle righe
- worker2:filtra la tabella per trovare 200 righe
- worker2:tenta di avviare l'aggiornamento delle righe, ma ha selezionato le stesse righe di worker1 quindi si blocca sul blocco di worker1
- lavoratore1:termina l'aggiornamento delle righe
- worker2:dopo il rilascio del blocco, ricontrolla la condizione WHERE e scopre che nessuna delle righe corrisponde più perché worker1 le ha aggiornate. Aggiorna zero righe.
... e ripeti!
Devi:
- Avere una coda centrale distribuire le righe in modo corretto e sicuro per la concorrenza; o
- Assegna ai lavoratori intervalli di ID non sovrapposti su cui lavorare
Come per LIMIT
- potresti usare WHERE id IN (SELECT t.id FROM thetable t LIMIT 200 ORDER BY id)
- ma avresti lo stesso problema con entrambi i lavoratori che scelgono lo stesso insieme di righe da aggiornare.