Warunki wyścigu w django

Oto prosty przykład widoku django z potencjalną sytuacją wyścigu:

<code># 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()
</code>

Warunki wyścigu powinny być dość oczywiste: użytkownik może wykonać to żądanie dwukrotnie, a aplikacja może potencjalnie wykonaćuser = request.user jednocześnie, powodując, że jedno z żądań zastąpi drugie.

Załóżmy, że funkcjacalculate_points jest stosunkowo skomplikowany i wykonuje obliczenia na podstawie wszystkich dziwnych rzeczy, których nie można umieścić w jednymupdate i byłoby trudne do wprowadzenia do procedury składowanej.

Oto moje pytanie: jakie mechanizmy blokowania są dostępne dla django, aby radzić sobie z sytuacjami podobnymi do tego?

questionAnswers(6)

yourAnswerToTheQuestion