Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Spring: transaction, propagation, mandatory

Что делают MANDATORY и NEVER?

Вопрос проверяет понимание строгих ограничений на использование транзакций и умение контролировать корректность вызовов бизнес-логики.

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

MANDATORY требует, чтобы метод вызывался внутри уже существующей транзакции. Если транзакции нет — будет выброшено исключение. NEVER, наоборот, запрещает наличие транзакции. Если метод вызывается внутри транзакции, Spring тоже выбросит исключение. Эти режимы используются для жёсткого контроля архитектуры.

Длинный ответ

MANDATORY и NEVER применяются реже, чем REQUIRED, но они полезны для защиты инвариантов системы.

Определение

MANDATORY — метод обязан выполняться внутри существующей транзакции.
NEVER — метод не должен выполняться внутри транзакции.

MANDATORY

Этот режим используется, когда метод логически не имеет смысла без транзакции.

Поведение:

  1. Если транзакция есть — метод выполняется в ней

  2. Если транзакции нет — выбрасывается исключение

Типичные сценарии:

  • низкоуровневые репозитории

  • операции, которые всегда должны быть атомарными

  • защита от случайного вызова вне транзакции

Пример:

@Transactional(propagation = Propagation.MANDATORY)
void updateBalance() {
    // должна быть активная транзакция
}

NEVER

Используется, когда транзакция вредна или недопустима.

Поведение:

  1. Если транзакции нет — метод выполняется

  2. Если транзакция есть — выбрасывается исключение

Типичные сценарии:

  • операции чтения без блокировок

  • вызовы внешних сервисов

  • логика, не совместимая с транзакциями

Пример:

@Transactional(propagation = Propagation.NEVER)
void sendNotification() {
    // не должно быть транзакции
}

Вывод

MANDATORY и NEVER — это инструменты архитектурного контроля. Они помогают явно зафиксировать требования к транзакционному контексту.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • Spring

    Spring

Ключевые слова

#transaction

#propagation

#mandatory

Подпишись на Java Developer в телеграм