Возможное состояние гонки при ограничении создания модели по количеству
У меня есть функция представления django, представляющая процесс выкупа приза. Я пытаюсь устранить возможное условие гонки при установке лимита выкупа на основе подсчета связанной модели (Redemption). На высоком уровне моя функция представления выглядит следующим образом:
def redeem(request, prize_id):
# Get a prize model that contains a limit attribute
prize = Prize.objects.get(id=prize_id)
# Check the count of a set of another model representing redemption objects
if (prize.redemption_set.count() >= prize.redemption_limit):
return error_page("Reached redemption limit")
else:
# Run some API calls that redeem the prize
# Create a redemption object in the DB
redemption = Redemption(prize=prize)
redemption.save()
Итак, меня беспокоит то, что при одновременном поступлении запросов я вижу возможность возникновения дополнительных выкупов, если счетчик не будет обновлен к моменту поступления другого запроса. Я рассматривал select_for_update()
и атомарные запросы, но я не хочу, чтобы возникали ошибки, если модель заблокирована. В основном я хочу убедиться, что вызовы выкупа попадают в очередь и соответствующим образом отклоняются при достижении лимита выкупа. У меня будет несколько веб-рабочих, а моя БД - mySQL.
Спасибо за любые советы!
Я полагаю, я сделал что-то неправильно в первый раз, и пока я продолжаю составлять композицию со старым изображением, проблема просто продолжает всплывать.
Поступая таким образом, вы можете гарантировать, что не будете обрабатывать несколько призов.