Mysql
 sql >> Base de données >  >> RDS >> Mysql

SELECT et verrouillez une ligne puis UPDATE

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.