如何将django @transaction装饰器应用于芹菜任务

时间:2018-06-16 14:32:21

标签: django transactions celery

在我的项目中,我默认使用交易。我想为几个芹菜任务禁用它们。但是当我使用:

https://docs.djangoproject.com/en/2.0/topics/db/transactions/#django.db.transaction.non_atomic_requests

from django.db import transaction

@transaction.non_atomic_requests
@app.task(bind=True, name='my_task')
def tasks_monitor(task):
    m = MyModel.objects.get(id=1)
    m.value = 5
    m.save()
    time.sleep(40)

我的芹菜任务仍在进行交易。看起来@transaction.non_atomic_requests@transaction.atomic_requests没有应用。

UPD:尝试交换订单,而不是工作。 当我禁用DATABASES['default']['ATOMIC_REQUESTS'] = False时,它按预期工作

1 个答案:

答案 0 :(得分:0)

transaction.non_atomic_requests用于装饰视图,它不会对Celery任务产生任何影响。但事情就是这样:ATOMIC_REQUESTS设置也不应该有任何效果!它在Django中被评估的唯一地方是core.handlers.base.make_view_atomic,它包含了视图。

因此,我的假设是您使用CELERY_TASK_ALWAYS_EAGER=True(旧版本的Celery中的CELERY_ALWAYS_EAGER)运行您的应用程序。在这种情况下,视图的事务处于活动状态。如果将其设置为False并在工作程序中运行任务,则应自动进行每个数据库操作。