Фоновая задача иногда не находит в базе только что созданный заказ
with transaction.atomic():
order = Order.objects.create(user=user, total=total)
send_confirmation.delay(order.id)
reserve_stock(order) # ещё несколько запросов в базу
Задача Celery send_confirmation делает Order.objects.get(id=order_id) и периодически падает с DoesNotExist, хотя заказ в базе в итоге есть. Почему?
- Задача уходит в очередь до коммита, и воркер читает базу раньше него
- Celery передаёт id строкой, и get не находит заказ по числовому ключу
- Воркер подключён к другой базе данных, чем веб-приложение
- Внутри atomic нельзя вызывать delay — Celery отменяет задачу
