Django: atomic и on_commit
Сохранение связанных объектов выполняйте атомарно; зависимое внешнее действие запускайте после commit.
Плохо
order = Order.objects.create(**data)
notify(order.pk)
Item.objects.create(order=order, **item)
Хорошо
with transaction.atomic():
order = Order.objects.create(**data)
Item.objects.create(order=order, **item)
transaction.on_commit(lambda: notify(order.pk))
Почему это важно
При ошибке создания позиции заказ не должен остаться частично сохранённым.
Когда применять
Django 5.2 и транзакционная БД. Импорт: from django.db import transaction. Callback on_commit не является гарантированной очередью; для доставки после аварии нужен outbox.
Кто что делает
Человек
Определяет атомарность заказа и гарантию доставки уведомлений.
AI-агент
Добавляет atomic, on_commit и проверку rollback; отделяет быстрый callback от фоновой обработки.
Пример применения
Заказ и его позиции сохраняются вместе. В on_commit ставится задача уведомления; если уведомление нельзя потерять при аварии, намерение записывается в outbox внутри atomic.
Как проверить у себя
- Ошибка позиции откатывает заказ.
- После rollback callback не запускается.
Первоисточники
История изменений на GitHubДата проверки отражает содержательную сверку. Синхронизация сайта не обновляет её автоматически.