Вопрос проверяет понимание строгих ограничений на использование транзакций и умение контролировать корректность вызовов бизнес-логики.
MANDATORY требует, чтобы метод вызывался внутри уже существующей транзакции. Если транзакции нет — будет выброшено исключение. NEVER, наоборот, запрещает наличие транзакции. Если метод вызывается внутри транзакции, Spring тоже выбросит исключение. Эти режимы используются для жёсткого контроля архитектуры.
MANDATORY и NEVER применяются реже, чем REQUIRED, но они полезны для защиты инвариантов системы.
MANDATORY — метод обязан выполняться внутри существующей транзакции.NEVER — метод не должен выполняться внутри транзакции.
MANDATORYЭтот режим используется, когда метод логически не имеет смысла без транзакции.
Поведение:
Если транзакция есть — метод выполняется в ней
Если транзакции нет — выбрасывается исключение
Типичные сценарии:
низкоуровневые репозитории
операции, которые всегда должны быть атомарными
защита от случайного вызова вне транзакции
Пример:
@Transactional(propagation = Propagation.MANDATORY)
void updateBalance() {
// должна быть активная транзакция
}
NEVERИспользуется, когда транзакция вредна или недопустима.
Поведение:
Если транзакции нет — метод выполняется
Если транзакция есть — выбрасывается исключение
Типичные сценарии:
операции чтения без блокировок
вызовы внешних сервисов
логика, не совместимая с транзакциями
Пример:
@Transactional(propagation = Propagation.NEVER)
void sendNotification() {
// не должно быть транзакции
}
MANDATORY и NEVER — это инструменты архитектурного контроля. Они помогают явно зафиксировать требования к транзакционному контексту.