Вот простой пример представления 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, чтобы справляться с ситуациями, подобными этой?