这是一个具有潜在竞争条件的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有哪些锁定机制可用于处理类似情况?