Для связанных изменений в одной базе Django обычно используют transaction.atomic(). Если исключение выходит из блока, изменения этой транзакции откатываются.
Если все действия выполняются последовательно в одной Django view и при ошибке нужно откатить изменения, что обычно используется?
Для связанных изменений в одной базе Django обычно используют transaction.atomic(). Если исключение выходит из блока, изменения этой транзакции откатываются.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Для связанных изменений в одной базе Django обычно используют transaction.atomic(). Если исключение выходит из блока, изменения этой транзакции откатываются.
Внутри блока выполняют все операции, которые должны быть атомарными; исключения БД обычно обрабатывают снаружи этого блока, чтобы не продолжать работать со сломанной транзакцией. HTTP-вызовы, уже отправленные письма и изменения другой независимой БД автоматически не откатятся. Такие эффекты выносят после commit либо оформляют через outbox. Atomicity также не заменяет нужные блокировки и уровень изоляции при конкурентных запросах. Вложенный atomic обычно создаёт savepoint, а окончательный commit выполняется на внешнем уровне.