UPDATE
låser raden, så du behöver inte låsa den först. Om du försöker UPDATE
överlappande uppsättningar rader samtidigt, den andra UPDATE
väntar på att den förstas transaktion genomförs eller återställs.
Det stora problemet med ditt tillvägagångssätt - förutom det faktum att UPDATE
har ingen LIMIT
klausul - är att flera arbetare alla kommer att försöka ta samma rader. Så här händer:
- arbetare1:Filtrerar tabellen för att hitta 200 rader och låser dem
- arbetare1:börjar uppdatera rader
- arbetare2:filtrerar tabellen för att hitta 200 rader
- arbetare2:försöker börja uppdatera rader, men har valt samma rader som arbetare1 så det blockerar arbetar1s lås
- arbetare1:Avslutar uppdateringen av rader
- arbetare2:Efter att låset släppts, kontrollerar WHERE-villkoret igen och upptäcker att ingen av raderna matchar längre eftersom arbetare1 har uppdaterat dem. Uppdaterar noll rader.
... och upprepa!
Du måste antingen:
- Ha en central kö dela ut rader på ett korrekt samtidighetssäkert sätt; eller
- Tilldela arbetare icke-överlappande intervall av ID att arbeta på
När det gäller LIMIT
- du kan använda WHERE id IN (SELECT t.id FROM thetable t LIMIT 200 ORDER BY id)
- men du skulle ha samma problem med att båda arbetarna väljer samma uppsättning rader att uppdatera.