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