Что произойдёт с REST-вызовом, если последняя операция с БД упадёт внутри Spring-транзакции?

Поведение REST-вызова внутри Spring-транзакции Spring-транзакция охватывает только операции с БД и локальными ресурсами REST-вызов представляет собой внешний HTTP-запрос, который транзакция не контролирует при…

Короткий ответ

Что ответить на собеседовании

Поведение REST-вызова внутри Spring-транзакции Spring-транзакция охватывает только операции с БД и локальными ресурсами REST-вызов представляет собой внешний HTTP-запрос, который транзакция не контролирует при rollback изменения в БД будут откачены REST-вызов не откатится автоматически — он уже завершён, поэтому его эффект сохранится для внешних сервисов нужны паттерны компенсации, например саги иначе между сервисами может появиться расхождение данных возможные меры: вынести внешние вызовы за пределы транзакции или обеспечить их идемпотентность

Подробный разбор

Ответ с пояснениями

Поведение REST-вызова внутри Spring-транзакции

  • Spring-транзакция охватывает только операции с БД и локальными ресурсами
  • REST-вызов представляет собой внешний HTTP-запрос, который транзакция не контролирует
  • при rollback изменения в БД будут откачены
  • REST-вызов не откатится автоматически — он уже завершён, поэтому его эффект сохранится
  • для внешних сервисов нужны паттерны компенсации, например саги
  • иначе между сервисами может появиться расхождение данных
  • возможные меры: вынести внешние вызовы за пределы транзакции или обеспечить их идемпотентность

Итог: REST-вызов останется выполненным, а rollback транзакции автоматически на него не повлияет.

Развёрнутый ответ

Краткий ответ

Если в рамках Spring-транзакции сначала выполняется операция с базой данных, затем отправляется REST-вызов — например, внешний HTTP-запрос — и после этого завершается ещё одна операция с БД, завершившаяся ошибкой, транзакция будет откачена только в части операций с базой. Уже отправленный REST-запрос сохранит свой результат, поскольку является внешним, вне-транзакционным side-effect и не входит в ACID-транзакцию Spring.

Основные моменты

  • Транзакции Spring и БД следуют модели ACID. Поэтому при исключении изменения в базе откатываются, если транзакция помечена как rollback-only.
  • REST-вызов — отдельный сетевой запрос с побочным эффектом; Spring не управляет им и не умеет автоматически выполнять его откат.
  • Следовательно, сбой последней операции с БД может вызвать rollback, но изменения в базе не сохранятся, тогда как внешний сервис уже обработал REST-вызов. Это типичная проблема side-effect, выполняемого внутри транзакции.
  • Чтобы снизить вероятность рассинхронизации, применяют паттерны саги или асинхронные сообщения (например, через Kafka). Согласование состояния в таком случае выполняется с помощью компенсирующих действий.

Практический контекст

Подобная ситуация часто возникает при интеграции с внешними API: например, сервис в ходе транзакции отправляет платёж или уведомление, а затем транзакция откатывается, хотя внешняя система уже получила «команду». Для минимизации несогласованности используют механизмы гарантий доставки, идемпотентности и компенсации.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку