Транзакция.атомарная задача сельдерея

У меня есть задача transaction.atomic celery:

@app.task(
    name="create_order",
    bind=True,
    ignore_results=True,
)
@transaction.atomic
def create_order(self: Task) -> None:
    
    try:
        data = MyModel.objects.select(...)
        # Some actions that may take long time and only use DB for SELECT queries 
        make_order(data, ...)
    except SomeException as exc:
        raise self.retry(exc=exc, countdown=5)
    else:
        data.status = DONE
        data.save()
Декоратор

@transaction.atomic создает новое соединение с БД и удерживает его перед любым исключением или оператором COMMIT. Но что если задача поднимет self.retry? Соединение будет закрыто, а когда задача повторит попытку, django откроет новое?

Технически, transaction.atomic не открывает новое соединение, а берет существующее соединение из коллекции django.db.connections, и эти соединения обычно создаются при запуске. Соединения остаются живыми и используются повторно во всем приложении. Обычно все соединения выполняют ping перед выполнением запроса, чтобы убедиться, что соединение пригодно для использования (в противном случае будет установлено новое соединение). Выход из блока кода задачи не приведет к закрытию соединения, и в зависимости от настроек соединения, при повторном запуске процесса произойдет то же самое (transaction.atomic возьмет соединение из коллекции connections, а затем выполнение запроса выполнит проверку соединения).

Вернуться на верх