Фрагмент создаёт заказ и сразу ставит задачу уведомления. Если он работает внутри внешней транзакции, воркер может получить order.id раньше commit; отправку нужно отложить до успешной фиксации.
def make_order():
Фрагмент создаёт заказ и сразу ставит задачу уведомления. Если он работает внутри внешней транзакции, воркер может получить order.id раньше commit; отправку нужно отложить до успешной фиксации.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
def make_order():
order = Order.objects.create(...)
print(order.id)
notify_order_created.delay(order.id)
Ответ
Фрагмент создаёт заказ и сразу ставит задачу уведомления. Если он работает внутри внешней транзакции, воркер может получить order.id раньше commit; отправку нужно отложить до успешной фиксации.
Само получение order.id не означает commit. Пример предполагает, что Order и задача определены в проекте:
from functools import partial
from django.db import transaction
def make_order():
with transaction.atomic():
order = Order.objects.create(...)
transaction.on_commit(
partial(notify_order_created.delay, order.id)
)
return order
Многоточие обозначает обязательные поля конкретной модели. Без внешней транзакции исходное create при autocommit уже зафиксировано, так что гонка не обязательна. Для гарантированной доставки при сбоях между commit и брокером применяют outbox.