Что определяет атрибут propagation в аннотации @Transactional (Spring)?

«Что определяет атрибут propagation в аннотации @Transactional (Spring)?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Атрибут propagation определяет, как должна вести себя транзакция, если она вызывается в контексте уже существующей транзакции.

Основные значения и их поведение:

Значение Поведение
REQUIRED (по умолчанию) Использует текущую транзакцию, если она есть. Если нет — создает новую.
REQUIRES_NEW Всегда создает новую, независимую транзакцию. Текущая транзакция приостанавливается.
SUPPORTS Выполняется в существующей транзакции, если она есть. Если нет — работает без транзакции.
NOT_SUPPORTED Выполняется без транзакции. Текущая транзакция приостанавливается.
MANDATORY Требует активной транзакции. Если ее нет — выбрасывается исключение.
NEVER Требует отсутствия транзакции. Если она есть — выбрасывается исключение.
NESTED Создает вложенную транзакцию (точка сохранения) внутри текущей. Поддерживается не всеми СУБД.

Пример использования REQUIRES_NEW:

@Service
public class LogService {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void auditLog(String action) {
        // Эта операция будет зафиксирована в БД в своей транзакции,
        // даже если основная транзакция будет откачена.
        logRepository.save(new AuditLog(action));
    }
}