Ce que vous devez faire, c'est ajouter une sorte de verrou ici pour éviter les conditions de concurrence comme celle que vous avez créée :
UPDATE persons SET processing=1 WHERE id=:id AND processing=0
Cela évitera un double verrouillage.
Pour améliorer encore plus cela, créez une colonne de verrouillage que vous pouvez utiliser pour réclamer :
UPDATE persons
SET processing=:processing_uuid
WHERE processing IS NULL
LIMIT 1
Cela nécessite un VARCHAR
, processing
indexé colonne utilisée pour la revendication qui a une valeur par défaut de NULL
. Si vous obtenez une ligne modifiée dans les résultats, vous avez revendiqué un enregistrement et pouvez continuer à travailler avec en utilisant :
SELECT * FROM persons WHERE processing=:processing_uuid
Chaque fois que vous essayez de réclamer, générez une nouvelle clé UUID de réclamation.