当前位置: 首页 > 面试题库 >

Django的比赛条件

冯通
2023-03-14
问题内容

这是带有潜在竞争条件的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可使用哪种锁定机制来处理类似的情况?


问题答案:

Django 1.4+支持select_for_update,在早期版本中,你可以执行原始SQL查询,例如select … forupdate,取决于基础数据库,该行将锁定该行免受任何更新的影响,你可以对该行执行任何操作,直到事务结束。例如

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()


 类似资料:
  • 我正在创建一个自定义记录器,在这里我们可以登录到std out和std err,但也可以登录到kafka(代码示例如下:https://github.com/roppa/kafka-go). 我们有多个主题,所以我们需要多个记录器,但当我们使用多个时,就会发生一些奇怪的事情。当Kafka围棋的两个设置都是异步的时,我不会收到消费者消息,当一个是异步的,另一个是同步的时,我们会得到如下结果: 更改同

  • 问题内容: 我正在阅读本书第4.3.5节 我不清楚它在哪里说 私有构造函数的存在是为了避免如果将复制构造函数实现为(px,py)时会发生竞争情况。这是私有构造函数捕获习语的一个示例(Bloch和Gafter,2005)。 我知道它提供了一个同时在数组中一次获取x和y的getter,而不是为每个数组分别获取一个getter,因此调用方将看到一致的值,但是为什么要使用private构造函数呢?这有什么

  • 比赛速度功能有助于您保持稳定配速,并在设定距离内达到您的目标时间。定义某段距离的目标时间 - 例如将 10 公里跑步的目标时间设定为 45 分钟,并跟踪对比实际用时与这个预设目标的差距。 您可以在手表上设置比赛速度,或者可以在 Flow 网络服务或应用程序中设置比赛速度目标,并同步至手表。 如果您已计划好当天的比赛速度目标,手表会在进入训练准备模式时建议您启动该目标。 在手表上创建比赛速度目标 您

  • 比赛速度功能有助于您保持稳定配速,并在设定距离内达到您的目标时间。定义某段距离的目标时间 - 例如将 10 公里跑步的目标时间设定为 45 分钟,并跟踪对比实际用时与这个预设目标的差距。 您可以在手表上设置比赛速度,或者可以在 Flow 网络服务或应用中设置比赛速度目标,并同步至手表。 如果您已计划好当天的比赛速度目标,手表会在进入训练准备模式时建议您启动该目标。 在手表上创建比赛速度目标 您可以

  • 问题内容: 该代码应获取或创建一个对象,并在必要时对其进行更新。该代码已在网站上投入生产。 在某些情况下-当数据库繁忙时-它会引发异常“ DoesNotExist:MyObj匹配查询不存在”。 我在ubuntu上使用了一个innodb mysql数据库。 我如何安全地处理此问题? 问题答案: 基本上get_or_create 可能会失败 -如果你查看其来源,就会发现它是:get,if-proble

  • 本文向大家介绍Android自定义控件实现球赛比分条效果,包括了Android自定义控件实现球赛比分条效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android实现球赛比分条效果的具体代码,供大家参考,具体内容如下 效果图如下所示: 该控件需要输入两个参数,左边的得分数和右边的的分数 然后根据两边的得分的比例绘制中间的比分条 首先将控件的宽度平均分配为10分,第一份和最后一份