Для чего используется аннотация @Transactional в Spring?

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

Ответ

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

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

  • Гарантия атомарности: Все операции внутри метода выполняются как единое целое.
  • Автоматический откат: При возникновении непроверяемого исключения (RuntimeException) транзакция автоматически откатывается.
  • Управление изоляцией и распространением: Через параметры аннотации можно тонко настраивать поведение транзакции.

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

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

    @Transactional // Все вызовы репозитория внутри этого метода будут в одной транзакции
    public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
        Account from = accountRepository.findById(fromId).orElseThrow();
        Account to = accountRepository.findById(toId).orElseThrow();

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

        accountRepository.save(from);
        accountRepository.save(to);
        // При успешном выполнении транзакция фиксируется.
        // При RuntimeException — полностью откатывается.
    }
}

Почему это важно: Без @Transactional каждая операция save() была бы в отдельной авто-коммитящейся транзакции, что могло бы привести к несогласованности данных при ошибке между списанием и зачислением.