从我在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默认)。
答案 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()
重新加载实例以从数据库获取更新的值。