Как декларативно создать транзакцию в Spring?

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

Ответ

Основной способ — использование аннотации @Transactional. Она управляет транзакциями автоматически, избавляя от необходимости писать шаблонный код.

Пример сервиса:

@Service
public class TransferService {
    @Autowired
    private AccountRepository repository;

    @Transactional
    public void transfer(Long fromId, Long toId, BigDecimal amount) {
        Account from = repository.findById(fromId).orElseThrow();
        Account to = repository.findById(toId).orElseThrow();

        from.debit(amount);
        to.credit(amount);

        repository.saveAll(List.of(from, to));
    }
}

Как это работает:

  1. Перед вызовом метода помеченного @Transactional, Spring открывает транзакцию (если еще не активна).
  2. При успешном завершении метода транзакция фиксируется (commit).
  3. При выбрасывании непроверяемого исключения (RuntimeException или его подкласса) транзакция откатывается (rollback).

Ключевые параметры аннотации:

  • propagation — определяет поведение при наличии уже активной транзакции (например, REQUIRED, REQUIRES_NEW).
  • isolation — уровень изоляции (например, READ_COMMITTED).
  • readOnly — оптимизация для операций только на чтение.
  • rollbackFor / noRollbackFor — уточнение, для каких исключений выполнять откат.

Требования: Для работы необходимо включить управление транзакциями в конфигурации с помощью @EnableTransactionManagement.