【问题标题】:Django atomic check and decrementDjango 原子检查和减量
【发布时间】:2013-03-21 21:42:32
【问题描述】:

我有一个模型变量,我们称它为 .actions,它是一个整数。这个想法是,人们只有在还有行动的情况下才能做事。

如何检查操作是否 > 0 并随后自动减少操作?我不希望他们受到负面影响。

if model.actions > 0:
  Model.objects.filter().update(actions=F('actions')-1)

我认为事务不能解决这个问题,因为它们不处理锁定。 select_for_update 似乎解决了这个问题,但该文档也非常不清楚。它会与默认交易设置一起使用还是需要其他设置?

【问题讨论】:

  • 我可以把它放在前面:teamQS = Team.objects.select_for_update().filter(id=team.id) 但是我从查询集中得到了团队作为 teamQS[0] 并检查并写信给那个团队。 select_for_update 会在什么时候产生锁?

标签: database django concurrency locking


【解决方案1】:

我得到了这个解决方案:

returnValue = MyObject.objects.filter(pk=x, points__gt=0).update(points=F('points')-1)

仅在满足条件时更新,并为您提供一个返回值,您可以检查它是否发生(这意味着点是否确实大于 0)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多