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

How to apply django @transaction decorator to celery task

在我的项目中我默认使用事务。我想为一些芹菜任务禁用它们。但是当我使用:

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)

我的celery任务还是做交易。看起来 @transaction.non_atomic_requests@transaction.atomic_requests 不适用。

UPD: 正在尝试调换顺序,但也不起作用。 当我禁用 DATABASES['default']['ATOMIC_REQUESTS'] = False 它按预期工作

transaction.non_atomic_requests 是为了装饰视图,它不会对 Celery 任务有任何影响。但问题是:设置 ATOMIC_REQUESTS 也不应该有任何效果!它在 Django 中唯一被评估的地方是 core.handlers.base.make_view_atomic,它包装了视图。

因此,我的假设是您 运行 您的应用程序具有 CELERY_TASK_ALWAYS_EAGER=TrueCELERY_ALWAYS_EAGER 在旧版本的 Celery 中)。在这种情况下,视图的事务是活动的。如果您将它设置为 False 和 运行 您在工作人员中的任务,则每个数据库操作都应自动执行。