由于并发更新,Postgresql无法序列化访问,如何找出原因

时间:2018-11-15 08:51:22

标签: django postgresql celery

项目使用Django和Postgresql 9.5。有时我在芹菜任务中看到错误。

当对象需要更改指定列时,它将使用celery任务。
该任务将对象和更新列的单独表更改历史记录写入(不是由Django ORM提供的原始SQL)。 通过FDW扩展将任务写入历史记录到外部表中。

抛出异常: Remote SQL command: COMMIT TRANSACTION\nSQL statement "SELECT 1 FROM ONLY "public"."incident_incident" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x"\n',)

我无法理解为什么会引发异常。任务很简单

屏幕日志(可能有帮助): enter image description here enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

在芹菜中,当您进行交易时,可以使用transaction.atomic块来完成。

例如:

@app.task(bind=True)
def do_task(self)
    try:
        with transaction.atomic():
           # Do DB OP
    except (SomeException,Exception) as exc:
        raise self.retry(exc=exc)

还有其他方法。您可以在模型中添加有关对象更改的新字段并进行跟踪。您可以阅读this article on medium regarding this approach。希望对您有帮助!