UPDATE
uzamkne řádek, takže jej nemusíte nejprve zamykat. Pokud se pokusíte UPDATE
překrývající se sady řádků současně, druhý UPDATE
bude čekat na potvrzení nebo vrácení transakce první.
Velký problém s vaším přístupem - kromě skutečnosti, že UPDATE
nemá LIMIT
klauzule - je, že více pracovníků se pokusí zachytit stejné řádky. Zde je to, co se stane:
- pracovník1:Filtruje tabulku tak, aby nalezla 200 řádků a uzamkla je
- pracovník1:zahájí aktualizaci řádků
- pracovník2:filtruje tabulku a najde 200 řádků
- pracovník2:pokusí se zahájit aktualizaci řádků, ale vybral stejné řádky jako pracovník1, takže blokuje na zámku pracovníka1
- pracovník1:Dokončí aktualizaci řádků
- worker2:Po uvolnění zámku znovu zkontroluje podmínku WHERE a zjistí, že žádný z řádků již neodpovídá, protože je worker1 aktualizoval. Aktualizuje nula řádků.
... a opakujte!
Musíte buď:
- Mějte centrální frontu předávání řádků řádným způsobem bezpečným pro souběžnost; nebo
- Přidělte pracovníkům nepřekrývající se rozsahy ID, se kterými budou pracovat
Pokud jde o LIMIT
- můžete použít WHERE id IN (SELECT t.id FROM thetable t LIMIT 200 ORDER BY id)
- ale měli byste stejný problém s tím, že by oba pracovníci zvolili stejnou sadu řádků k aktualizaci.