同时递增数据库计数器



从我在PostgreSQL文档中读到的内容来看,似乎像这样的查询

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 默认(。

您可能需要一个 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()

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

最新更新