Wat je moet doen, is hier een soort vergrendeling toevoegen om race-omstandigheden zoals degene die je hebt gemaakt te voorkomen:
UPDATE persons SET processing=1 WHERE id=:id AND processing=0
Dat voorkomt dubbele vergrendeling.
Om dit nog meer te verbeteren, maakt u een slotkolom die u kunt gebruiken om te claimen:
UPDATE persons
SET processing=:processing_uuid
WHERE processing IS NULL
LIMIT 1
Dit vereist een VARCHAR
, geïndexeerde processing
kolom gebruikt voor claimen die een standaardwaarde heeft van NULL
. Als u een rij krijgt die in de resultaten wordt gewijzigd, heeft u een record geclaimd en kunt u ermee aan de slag door:
SELECT * FROM persons WHERE processing=:processing_uuid
Elke keer dat je probeert te claimen, genereer je een nieuwe claim-UUID-sleutel.