Хотя вы не предоставляете код, структуры таблиц или более подробную информацию о базе данных, первым советом в этих случаях будет использование LOCK
Если ваша таблица innoDB, вы можете воспользоватьсяБлокировка на уровне строк, хотя это не имеет значения, если таблица имеет одну строку.
В псевдокоде при каждом попадании вам потребуется:
LOCK TABLE prizes
SELECT claimed, alloted FROM prizes
if claimed < alloted award prize
UPDATE prizes set claimed = claimed +1
else
do_nothing
UNLOCK TABLE prizes
<<after unlocking>>
if the user got an award, do whatever you need to do to award the prize which is not "inventory-sensitive" and can be done asynchronously
время, чтобы этоВыполнение будет в миллисекундах, поэтому не должно быть проблемой, чтобы все попадания были поставлены в очередь, если ваш сервер БД хорошо смазан, хотя вы можете достичь лимита процесса или лимита соединения на сервере приложений, поэтому что-то вроде этого может потребоватьсянекоторые стресс-тесты.
Это может быть сложно, сложно, привередливо ...
Более простой путь:
создать таблицу claim_attempt
с автоматическим-инкрементный первичный ключ и поле, которое ссылается на что-то о пользователе.
При каждом попадании вставляйте запись (независимо от доступного инвентаря) и извлекайте идентификатор вставленной строки.После этого сравните полученный идентификатор с назначенным номером награды.Если id <= alloted, то запустите любой процесс, который необходимо запустить, чтобы вручить приз пользователю.Если id> выделен, выведите сообщение «повторить попытку в следующий раз»