Middle
Какво означава анотацията @Transactional в Spring Data?
sobes.tech AI
Отговор от 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 обикновено се използва в конфигурационен клас, за да активира декларативното управление на транзакциите.