UPDATE
bloquea la fila, por lo que no necesita bloquearla primero. Si intenta UPDATE
conjuntos superpuestos de filas simultáneamente, el segundo UPDATE
esperará a que la primera transacción se confirme o revierta.
El gran problema con su enfoque, aparte del hecho de que UPDATE
no tiene un LIMIT
cláusula - es que varios trabajadores intentarán tomar las mismas filas. Esto es lo que sucede:
- worker1:filtra la tabla para encontrar 200 filas y las bloquea
- worker1:comienza a actualizar filas
- worker2:filtra la tabla para encontrar 200 filas
- trabajador2:intenta comenzar a actualizar las filas, pero ha seleccionado las mismas filas que el trabajador1, por lo que bloquea el bloqueo del trabajador1
- worker1:Finaliza la actualización de filas
- worker2:después de liberar el bloqueo, vuelve a verificar la condición WHERE y descubre que ninguna de las filas coincide porque el trabajador1 las ha actualizado. Actualiza cero filas.
... y repite!
Necesitas:
- Tener una cola central repartir filas de una manera adecuada y segura para la concurrencia; o
- Asigne a los trabajadores rangos de ID que no se superpongan para trabajar
En cuanto a LIMIT
- podría usar WHERE id IN (SELECT t.id FROM thetable t LIMIT 200 ORDER BY id)
- pero tendría el mismo problema si ambos trabajadores eligieran el mismo conjunto de filas para actualizar.