Sobes.tech
Назад к вопросам
Middle+
3

Расскажите про propagation типы в аннотации @Transactional. Доводилось задавать не дефолтные?

Компании, где спрашивали
луция

Ответ от нейросети

sobes.tech AI

В аннотации @Transactional в Spring есть параметр propagation, который определяет, как должна вести себя транзакция при вызове метода внутри уже существующей транзакции.

Основные типы propagation:

  • REQUIRED (по умолчанию): если есть текущая транзакция, метод выполняется в ней, иначе создаётся новая.
  • REQUIRES_NEW: всегда создаёт новую транзакцию, существующая приостанавливается.
  • SUPPORTS: если есть транзакция, использовать её, иначе выполнять без транзакции.
  • NOT_SUPPORTED: всегда выполнять без транзакции, приостанавливая существующую.
  • MANDATORY: должен быть вызван внутри транзакции, иначе исключение.
  • NEVER: должен быть вызван вне транзакции, иначе исключение.
  • NESTED: если есть транзакция, создать вложенную (savepoint), иначе как REQUIRED.

Использование не дефолтных propagation полезно, когда нужно контролировать границы транзакций, например:

  • REQUIRES_NEW для независимых операций, чтобы ошибки в них не откатывали основную транзакцию.
  • NESTED для частичного отката внутри большой транзакции.

Пример:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveAudit() {
    // сохраняем аудит независимо от основной транзакции
}