Lo que debe hacer es agregar algún tipo de bloqueo aquí para evitar condiciones de carrera como la que ha creado:
UPDATE persons SET processing=1 WHERE id=:id AND processing=0
Eso evitará el doble bloqueo.
Para mejorar esto aún más, cree una columna de bloqueo que pueda usar para reclamar:
UPDATE persons
SET processing=:processing_uuid
WHERE processing IS NULL
LIMIT 1
Esto requiere un VARCHAR
, processing
indexado columna utilizada para afirmar que tiene un valor predeterminado de NULL
. Si obtiene una fila modificada en los resultados, ha reclamado un registro y puede trabajar con él usando:
SELECT * FROM persons WHERE processing=:processing_uuid
Cada vez que intente reclamar, genere una nueva clave UUID de reclamación.