Django Celery任务和交易

时间:2018-03-27 21:48:16

标签: django transactions celery

假设您有一些包含唯一字段的模型,并且您有一个异步任务,可以将新模型实例保存到DB。像这样的东西:

@shared_task
def create_model(model_identifier):
    with transaction.atomic():
        serializer=MyModelSerializer(data=model_data)
        serializer.is_valid()
        serializer.save()
        .
        .
        .
        some more actions

然后使用相同的标识符依次创建其中2个任务。 第一个将首先保存新实例,因此当第二个实例到达“保存()”时part - 该对象已经存在但尚未提交。 在那种情况下会发生什么? 如果我做对了,看起来当第二个到达“保存()' (在is_valid()传递之后),它等待第一个完成事务(尽管它们基本上并行运行),然后才引发integrityError异常。

听起来不错吗?

1 个答案:

答案 0 :(得分:0)

尝试使用@ app.task而不是@shared_task

解释@ app.task的文件 http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html#application

使用apply_async在队列中添加任务。