postgresql Django create()和get()之间的竞争条件

2o7dmzc5  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(115)

自从我们上一个版本以来,一系列看起来只能是数据库的竞争条件已经发生了。我们使用python 3.10,django-rq,Django 4和Postgres。
在一个案例中:

x = Model.objects.create()
job.delay(x_id=x.id)

在作业中,我们调用Model.objects.get(id = x.id),它会引发'matching query doesn't exist.'错误。这大约发生在日志的五分之一
在另一种情况下,我们创建对象,将其添加到列表中,然后对列表进行操作,并且在大多数情况下它仍然有效,但我们会得到一个'匹配查询不存在'错误。
我完全被我应该做什么难倒了,我找不到很多类似的问题,也不能在我的测试环境中重现这些问题。
我的最佳假设是对数据库的写入太多,因此在代码尝试再次获取对象时,事务尚未提交。
任何帮助/建议都将是惊人的

  • 我已经一步一步地检查了代码,以确保逻辑是合理的
  • 尝试重新创建“繁忙”数据库,但没有成功
  • 已经尝试了破碎的数据等,但它都被抓住,我们的日志也没有建议这样的事情
j8ag8udp

j8ag8udp1#

在这种情况下,get对象的作业应该在create提交到数据库之后进行调度。
这可以使用on_commit钩子www.example.com来完成https://docs.djangoproject.com/en/4.2/topics/db/transactions/#performing-actions-after-commit
示例:

from django.db import transaction

@transaction.atomic
def your_method():
    x = Model.objects.create()
        
    transaction.on_commit(job.delay(x_id=x.id))

相关问题