sql >> Base de Datos >  >> RDS >> Mysql

SELECCIONE y bloquee una fila y luego ACTUALICE

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.