Ответ
Основной способ — использование аннотации @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));
}
}
Как это работает:
- Перед вызовом метода помеченного
@Transactional, Spring открывает транзакцию (если еще не активна). - При успешном завершении метода транзакция фиксируется (commit).
- При выбрасывании непроверяемого исключения (
RuntimeExceptionили его подкласса) транзакция откатывается (rollback).
Ключевые параметры аннотации:
propagation— определяет поведение при наличии уже активной транзакции (например,REQUIRED,REQUIRES_NEW).isolation— уровень изоляции (например,READ_COMMITTED).readOnly— оптимизация для операций только на чтение.rollbackFor/noRollbackFor— уточнение, для каких исключений выполнять откат.
Требования: Для работы необходимо включить управление транзакциями в конфигурации с помощью @EnableTransactionManagement.