同时增加数据库计数器

时间:2018-04-12 19:28:02

标签: python django postgresql concurrency

从我在PostgreSQL documentation中看到的内容,似乎是像

这样的查询
UPDATE accounts SET balance = balance + 100 WHERE account_id = 12345

是原子的,可以安全地同时执行。这是仅在更新单个整数列时的情况吗?在我的Django应用程序中,我有这样的查询(由ORM生成):

UPDATE "mytable" SET "counter" = ("mytable"."counter" + 1), 
  "owner" = NULL, "updated" = '2018-04-12T12:53:17.826257+00:00'::timestamptz
WHERE "mytable"."id" = 27; args=(1, datetime.datetime(2018, 4, 12, 12, 53, 17, 826257, tzinfo=<UTC>), 27)

由多个后台作业同时执行。在这种情况下,计数器是否会原子更新?我正在使用自动提交模式(Django默认)。

1 个答案:

答案 0 :(得分:0)

您可能需要一个F表达式:https://docs.djangoproject.com/en/2.1/ref/models/expressions/#f-expressions

从文档中看:F()的另一个有用的好处是让数据库(而不是Python)更新字段的值避免了竞争情况。

from django.db.models import F
instance = MyModel.objects.get(pk=xxx)
instance.counter = F('instance.counter') + 1
instance.owner = null
instance.save()

重新加载实例以从数据库获取更新的值。