首页 > 解决方案 > 如何将 django @transaction 装饰器应用于 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它时,它按预期工作

标签: djangotransactionscelery

解决方案


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

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


推荐阅读