自从我们上一个版本以来,一系列看起来只能是数据库的竞争条件已经发生了。我们使用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.'错误。这大约发生在日志的五分之一
在另一种情况下,我们创建对象,将其添加到列表中,然后对列表进行操作,并且在大多数情况下它仍然有效,但我们会得到一个'匹配查询不存在'错误。
我完全被我应该做什么难倒了,我找不到很多类似的问题,也不能在我的测试环境中重现这些问题。
我的最佳假设是对数据库的写入太多,因此在代码尝试再次获取对象时,事务尚未提交。
任何帮助/建议都将是惊人的
- 我已经一步一步地检查了代码,以确保逻辑是合理的
- 尝试重新创建“繁忙”数据库,但没有成功
- 已经尝试了破碎的数据等,但它都被抓住,我们的日志也没有建议这样的事情
1条答案
按热度按时间j8ag8udp1#
在这种情况下,
get
对象的作业应该在create
提交到数据库之后进行调度。这可以使用on_commit钩子www.example.com来完成https://docs.djangoproject.com/en/4.2/topics/db/transactions/#performing-actions-after-commit
示例: