Ответ
Аннотация @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() была бы в отдельной авто-коммитящейся транзакции, что могло бы привести к несогласованности данных при ошибке между списанием и зачислением.