同时递增数据库计数器

2024-09-27 21:26:04 发布

您现在位置:Python中文网/ 问答频道 /正文

从我在PostgreSQLdocumentation中读到的内容来看,查询

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默认)。你知道吗


Tags: djangoid内容datetimecountermytable情况update
1条回答
网友
1楼 · 发布于 2024-09-27 21:26:04

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

来自docs: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()

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

相关问题 更多 >

    热门问题