Есть таблица, допустим, сгенерированных промокодов. При регистрации юзера мне нужно отдать ему свободный промокод, и в таблице промокодов пометить что он уже занят этим юзером.
Проблемы возникают когда одновременно регаются несколько юзеров - возможна ситуация когда они одновременно получат один и тот же промокод, а в сам промокод запишеться последний юзер.
Как такого избежать?
Я вижу несколько решений, но все какие-то неказистые: юзать redis с его incr который содержит id следующего свободного промокода (они автоинкременты), можно сделать очередь с одним воркером на получение свободного промокода, можно вообще сделать отдельный fpm пул с единственным php-fpm процессом (это конечно садомазо) или ограничить очередь на запрос регистрации юзера в nginx.
mitaichik: Тогда я бы эти пачки складировал где-то (бд, файл и т.д.), а после регистрации выдавал пользователю 1 из них, при этом удаляя из склада и добавляя, как доп поле к таблице с пользователем или в отдельную таблицу.
Максим Тимофеев: ну как-то так примерно я и сделал, но при одновременной регистрации нескольких юзеров все равно возможны коллизии. Сейчас, конечно, мысль пришла вообще переписать это все на java (я все равно потихоньку переношу свой проект на Spring) - там подобные проблемы решаются одной строкой synchronized