gpt4 book ai didi

python - django 中的比赛条件

转载 作者:IT老高 更新时间:2023-10-28 21:50:50 25 4
gpt4 key购买 nike

这是一个带有潜在竞争条件的 django View 的简单示例:

# 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 可以使用什么样的锁定机制来处理类似的情况?

最佳答案

Django 1.4+ 支持 select_for_update ,在早期版本中,您可以执行原始 SQL 查询,例如select ... for update 取决于底层数据库将锁定该行以防止任何更新,您可以对该行执行任何操作,直到事务结束。例如

from django.db import transaction

@transaction.commit_manually()
def add_points(request):
user = User.objects.select_for_update().get(id=request.user.id)
# you can go back at this point if something is not right
if user.points > 1000:
# too many points
return
user.points += calculate_points(user)
user.save()
transaction.commit()

关于python - django 中的比赛条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1030270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com