Назад к вопросам
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() {
// сохраняем аудит независимо от основной транзакции
}