Vad du behöver göra är att lägga till något slags lås här för att förhindra tävlingsförhållanden som det du har skapat:
UPDATE persons SET processing=1 WHERE id=:id AND processing=0
Då slipper du dubbellåsa den.
För att förbättra detta ännu mer, skapa en låskolumn som du kan använda för att göra anspråk på:
UPDATE persons
SET processing=:processing_uuid
WHERE processing IS NULL
LIMIT 1
Detta kräver en VARCHAR
, indexerad processing
kolumn som används för anspråk som har en standard på NULL
. Om du får en rad ändrad i resultaten har du gjort anspråk på en post och kan gå och arbeta med den genom att använda:
SELECT * FROM persons WHERE processing=:processing_uuid
Varje gång du försöker göra anspråk, generera en ny UUID-nyckel för anspråk.