Това, което трябва да направите, е да добавите някакъв вид заключване тук, за да предотвратите условия на състезание като това, което сте създали:
UPDATE persons SET processing=1 WHERE id=:id AND processing=0
Това ще избегне двойното му заключване.
За да подобрите това още повече, създайте колона за заключване, която можете да използвате за искане:
UPDATE persons
SET processing=:processing_uuid
WHERE processing IS NULL
LIMIT 1
Това изисква VARCHAR
, индексирана processing
колона, използвана за заявяване, която има стойност по подразбиране NULL
. Ако получите ред, променен в резултатите, вие сте заявили запис и можете да работите с него, като използвате:
SELECT * FROM persons WHERE processing=:processing_uuid
Всеки път, когато се опитате да поискате, генерирайте нов UUID ключ за искане.