Вот простой пример представления django с условием потенциальной расы:
# myapp/views.py
from django.contrib.auth.models import User
from my_libs import calculate_points
def add_points(request):
user = request.user
user.points += calculate_points(user)
user.save()
Состояние гонки должно быть достаточно очевидным: пользователь может сделать этот запрос дважды, и приложение может потенциально выполнить user = request.user
одновременно, в результате чего один из запросов переопределит другой.
Предположим, что функция calculate_points
относительно сложна и выполняет расчеты на основе всевозможных странных вещей, которые нельзя поместить в один update
, и которые трудно поместить в хранимую процедуру.
Итак, вот мой вопрос: какие механизмы блокировки доступны для django, чтобы справиться с подобными ситуациями?