如何正确增加postgreSQL数据库中的计数器?

时间:2018-02-04 02:03:20

标签: django postgresql django-rest-framework

假设我想在我的应用中实现“喜欢/不喜欢”系统。我需要计算每个像以后的分类目的。我可以简单地插入当前值+ 1吗?我认为这太简单了。

如果两个用户同时点击怎么办?如何防止我的柜台被打扰?

我读过我需要通过简单的装饰器@transaction.atomic来实现事务,但我很想知道这是否可以解决我的问题。

事务被设计为执行由一个用户触发的操作的“集合”,而在我的情况下,我需要能够同时处理多个请求并安全地更新计数器。

有任何建议吗?

1 个答案:

答案 0 :(得分:1)

您可以使用F()表达式,例如

content.likes_count = F('likes_count') + 1
content.save()

因此操作将在数据库中而不是在python中执行。

来自django documentation

  

F()的另一个有用的好处是拥有数据库 - 而不是   比Python更新一个字段的值可以避免竞争条件。

     

如果两个Python线程执行上面第一个例子中的代码,那么一个   线程可以在之后检索,增加和保存字段的值   其他人已从数据库中检索到它。第二个值   线程保存将基于原始值;的工作   第一个线程将丢失。

     

如果数据库负责更新字段,则该过程为   更强大:它只会根据值更新字段   执行save()或update()时数据库中的字段,   而不是在检索实例时基于其值。