UPDATE bloqueia a linha, então você não precisa bloqueá-la primeiro. Se você tentar UPDATE sobreposição de conjuntos de linhas simultaneamente, o segundo UPDATE aguardará a primeira transação confirmar ou reverter. O grande problema com sua abordagem - além do fato de que
UPDATE não tem um LIMIT cláusula - é que vários trabalhadores tentarão pegar as mesmas linhas. Aqui está o que acontece:- worker1:filtra a tabela para encontrar 200 linhas e as bloqueia
- worker1:inicia a atualização das linhas
- worker2:filtra a tabela para encontrar 200 linhas
- worker2:tenta iniciar a atualização de linhas, mas selecionou as mesmas linhas que worker1 para bloquear no bloqueio de worker1
- worker1:conclui a atualização das linhas
- worker2:após a liberação do bloqueio, verifica novamente a condição WHERE e descobre que nenhuma das linhas corresponde mais porque worker1 as atualizou. Atualiza zero linhas.
... e repita!
Você precisa:
- Tenha uma fila central distribuindo as linhas de uma maneira segura de simultaneidade; ou
- Atribuir aos funcionários intervalos de IDs sem sobreposição para trabalhar
Quanto a
LIMIT - você pode usar WHERE id IN (SELECT t.id FROM thetable t LIMIT 200 ORDER BY id) - mas você teria o mesmo problema com os dois trabalhadores escolhendo o mesmo conjunto de linhas para atualizar.