Quello che devi fare è aggiungere una sorta di blocco qui per prevenire condizioni di gara come quella che hai creato:
UPDATE persons SET processing=1 WHERE id=:id AND processing=0
Ciò eviterà il doppio blocco.
Per migliorare ulteriormente questo aspetto, crea una colonna di blocco che puoi utilizzare per rivendicare:
UPDATE persons
SET processing=:processing_uuid
WHERE processing IS NULL
LIMIT 1
Ciò richiede un VARCHAR
, processing
indicizzata colonna utilizzata per rivendicare che ha un valore predefinito di NULL
. Se ricevi una riga modificata nei risultati, hai rivendicato un record e puoi lavorare con esso utilizzando:
SELECT * FROM persons WHERE processing=:processing_uuid
Ogni volta che provi a rivendicare, genera una nuova chiave UUID di rivendicazione.