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?