Вопрос проверяет понимание вложенных транзакций и поведения системы при вызове транзакционных методов друг из друга.
Propagation определяет, как метод с @Transactional ведёт себя относительно уже существующей транзакции. Spring поддерживает несколько типов propagation. Самый популярный — REQUIRED. Есть варианты для создания новой транзакции, запрета транзакций и обязательного наличия транзакции. Выбор propagation влияет на изоляцию и rollback.
Propagation отвечает за то, как транзакции «вкладываются» друг в друга.
Transaction propagation — это правило, определяющее, как метод с транзакцией взаимодействует с уже существующей транзакцией.
Перед перечислением важно понимать, что поведение зависит от наличия активной транзакции.
REQUIREDИспользует существующую транзакцию
Создаёт новую, если её нет
Значение по умолчанию
REQUIRES_NEWПриостанавливает текущую транзакцию
Создаёт новую транзакцию
Всегда выполняется в своей транзакции
SUPPORTSРаботает в транзакции, если она есть
Иначе выполняется без транзакции
MANDATORYТребует существующую транзакцию
Без неё выбрасывает исключение
NOT_SUPPORTEDПриостанавливает текущую транзакцию
Выполняется без транзакции
NEVERЗапрещает выполнение в транзакции
При наличии транзакции — ошибка
NESTEDСоздаёт вложенную транзакцию
Работает через savepoint
Поддерживается не всеми менеджерами
Propagation определяет поведение транзакций при вложенных вызовах. Неправильный выбор может привести к неожиданным rollback’ам.