Поведение REST-вызова внутри Spring-транзакции Spring-транзакция охватывает только операции с БД и локальными ресурсами REST-вызов представляет собой внешний HTTP-запрос, который транзакция не контролирует при rollback изменения в БД будут откачены REST-вызов не откатится автоматически — он уже завершён, поэтому его эффект сохранится для внешних сервисов нужны паттерны компенсации, например саги иначе между сервисами может появиться расхождение данных возможные меры: вынести внешние вызовы за пределы транзакции или обеспечить их идемпотентность
Что произойдёт с REST-вызовом, если последняя операция с БД упадёт внутри Spring-транзакции?
Поведение REST-вызова внутри Spring-транзакции Spring-транзакция охватывает только операции с БД и локальными ресурсами REST-вызов представляет собой внешний HTTP-запрос, который транзакция не контролирует при…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Поведение 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: например, сервис в ходе транзакции отправляет платёж или уведомление, а затем транзакция откатывается, хотя внешняя система уже получила «команду». Для минимизации несогласованности используют механизмы гарантий доставки, идемпотентности и компенсации.