假设我想在我的应用中实现“喜欢/不喜欢”系统。我需要计算每个像以后的分类目的。我可以简单地插入当前值+ 1吗?我认为这太简单了。
如果两个用户同时点击怎么办?如何防止我的柜台被打扰?
我读过我需要通过简单的装饰器@transaction.atomic
来实现事务,但我很想知道这是否可以解决我的问题。
事务被设计为执行由一个用户触发的操作的“集合”,而在我的情况下,我需要能够同时处理多个请求并安全地更新计数器。
有任何建议吗?
答案 0 :(得分:1)
您可以使用F()表达式,例如
content.likes_count = F('likes_count') + 1
content.save()
因此操作将在数据库中而不是在python中执行。
来自django documentation。
F()的另一个有用的好处是拥有数据库 - 而不是 比Python更新一个字段的值可以避免竞争条件。
如果两个Python线程执行上面第一个例子中的代码,那么一个 线程可以在之后检索,增加和保存字段的值 其他人已从数据库中检索到它。第二个值 线程保存将基于原始值;的工作 第一个线程将丢失。
如果数据库负责更新字段,则该过程为 更强大:它只会根据值更新字段 执行save()或update()时数据库中的字段, 而不是在检索实例时基于其值。