下面是一个具有潜在竞争条件的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可以使用什么样的锁定机制来处理类似的情况?