Внешний atomic открывает транзакцию, а вложенный обычно создаёт savepoint. Успешный выход из внутреннего блока не фиксирует изменения независимо: итоговый commit остаётся у внешнего.
Что произойдёт при вызове вложенной транзакции (atomic внутри atomic) в Django?
Внешний atomic открывает транзакцию, а вложенный обычно создаёт savepoint. Успешный выход из внутреннего блока не фиксирует изменения независимо: итоговый commit остаётся у внешнего.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Что произойдёт при вызове вложенной транзакции (atomic внутри atomic) в Django?
Ответ
Внешний atomic открывает транзакцию, а вложенный обычно создаёт savepoint. Успешный выход из внутреннего блока не фиксирует изменения независимо: итоговый commit остаётся у внешнего.
Ошибка во вложенном блоке приводит к откату до savepoint; если исключение выходит наружу, внешняя транзакция тоже откатывается. Обрабатывайте DB-исключения вокруг atomic-блока, не маскируя broken transaction внутри него. Параметр savepoint=False меняет эту схему; on_commit выполняется после успешной фиксации внешней транзакции, а не при выходе из внутренней.
Источник: docs.djangoproject.com.