РекомендуетсяDjangoPython

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

Дата проверки отражает содержательную сверку. Синхронизация сайта не обновляет её автоматически.