UPDATE
låser rækken, så du ikke behøver at låse den først. Hvis du prøver at UPDATE
overlappende sæt rækker samtidigt, den anden UPDATE
vil vente på, at den førstes transaktion begår eller rulle tilbage.
Det store problem med din tilgang - bortset fra det faktum, at UPDATE
har ikke en LIMIT
klausul - er, at flere arbejdere alle vil forsøge at få fat i de samme rækker. Her er, hvad der sker:
- arbejder1:Filtrerer tabellen for at finde 200 rækker og låser dem
- arbejder1:begynder at opdatere rækker
- arbejder2:filtrerer tabellen for at finde 200 rækker
- arbejder2:forsøger at begynde at opdatere rækker, men har valgt de samme rækker som arbejder1, så den blokerer på arbejder1s lås
- arbejder1:Færdiggør opdatering af rækker
- arbejder2:Efter frigivelse af lås, tjekker WHERE-tilstanden igen og finder ud af, at ingen af rækkerne matcher længere, fordi arbejder1 har opdateret dem. Opdaterer nul rækker.
... og gentag!
Du skal enten:
- Har en central kø uddeling af rækker på en ordentlig samtidighedssikker måde; eller
- Tildel arbejdere ikke-overlappende rækker af id'er at arbejde på
Med hensyn til LIMIT
- du kan bruge WHERE id IN (SELECT t.id FROM thetable t LIMIT 200 ORDER BY id)
- men du ville have det samme problem med at begge arbejdere vælger det samme sæt rækker at opdatere.