【问题标题】:How to properly increment a counter in my postgreSQL database?如何正确增加我的 postgreSQL 数据库中的计数器?
【发布时间】:2018-07-14 05:05:16
【问题描述】:

假设我想在我的应用中实现“喜欢/不喜欢”系统。我需要计算每个喜欢以便稍后进行排序。我可以简单地插入当前值 + 1 吗?我觉得太简单了。

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

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

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

有什么建议吗?

【问题讨论】:

    标签: django postgresql django-rest-framework


    【解决方案1】:

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

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

    所以操作将在数据库中而不是在python中执行。

    来自 django documentation

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

    如果两个 Python 线程执行上面第一个示例中的代码,一个 线程可以在 其他已从数据库中检索到它。第二个值 线程保存将基于原始值;的工作 第一个线程只会丢失。

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

    【讨论】:

    • 感谢您的提示。它看起来像我正在寻找的东西。
    猜你喜欢
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 2017-05-18
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多