Назад к вопросам
Middle
116
questionbank
Что обозначает аннотация @Transactional в Spring Data?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Аннотация @Transactional в Spring Data указывает, что метод или класс должен выполняться в рамках транзакции. Spring AOP (Aspect-Oriented Programming) создает вокруг такого метода прокси-объект, который управляет жизненным циклом транзакции.
Основные действия, выполняемые @Transactional:
- Начало транзакции: Перед выполнением аннотированного метода открывается новая транзакция или используется существующая.
- Выполнение метода: Выполняется логика самого метода.
- Фиксация или откат транзакции:
- Если метод завершается успешно без исключений (по умолчанию только
RuntimeException), транзакция фиксируется (commit). - Если из метода выбрасывается исключение (по умолчанию
RuntimeException), транзакция откатывается (rollback).
- Если метод завершается успешно без исключений (по умолчанию только
Основные атрибуты аннотации:
propagation: Определяет, как транзакции взаимодействуют друг с другом (например,REQUIRED,REQUIRES_NEW,SUPPORTS). По умолчаниюREQUIRED.isolation: Определяет уровень изоляции транзакции для предотвращения проблем параллельного доступа к данным (например,READ_COMMITTED,REPEATABLE_READ). По умолчанию используется уровень изоляции базы данных.readOnly: Указывает, что транзакция должна выполняться в режиме только для чтения. Оптимизирует производительность для чтений.timeout: Задает максимальное время выполнения транзакции до автоматического отката.rollbackFor: Указывает список типов исключений, при возникновении которых должен происходить откат транзакции. По умолчанию откатывается наRuntimeException.noRollbackFor: Указывает список типов исключений, при возникновении которых откат транзакции не должен происходить.
Пример использования:
// Пример сервисного слоя
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Transactional // Этот метод будет выполняться в транзакции
public User createUser(User user) {
// Логика создания пользователя, возможно, включает несколько операций с БД
userRepository.save(user);
// Может быть другая операция сохранения или обновления
// userRepository.updateRelatedInfo(user.getId(), ...);
return user;
}
@Transactional(readOnly = true) // Метод только для чтения, оптимизация
public User findUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
@Transactional(rollbackFor = CustomBusinessException.class) // Откат при определенном пользователем исключении
public void performCriticalOperation(Long userId) throws CustomBusinessException {
// Логика критической операции
// Может выбросить CustomBusinessException
}
}
Аннотация @EnableTransactionManagement обычно используется в конфигурационном классе, чтобы включить поддержку декларативного управления транзакциями.