Django原子检查和减量

时间:2013-03-31 18:26:28

标签: database django concurrency locking

我有一个模型变量,我们称它为.actions,它是一个整数。我们的想法是,如果还有行动,人们只能做事。

如果操作是>我该如何检查? 0然后原子地减少动作?我不希望他们遭受过负面的打击。

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

我不认为交易会解决这个问题,因为他们不处理锁定问题。 select_for_update似乎解决了这个问题,但该文档也很难理解。它是否适用于默认事务设置或是否需要其他设置?

1 个答案:

答案 0 :(得分:0)

我得到了这个解决方案:

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

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