Sobes.tech
Middle

Какво означава анотацията @Transactional в Spring Data?

sobes.tech AI

Отговор от AI

Аннотацията @Transactional в Spring Data указва, че метод или клас трябва да се изпълнява в рамките на транзакция. Spring AOP (Aspect-Oriented Programming) създава около такъв метод прокси-обект, който управлява жизнения цикъл на транзакцията.

Основните действия, изпълнявани от @Transactional:

  1. Начало на транзакцията: Преди изпълнението на анотирания метод се отваря нова транзакция или се използва съществуваща.
  2. Изпълнение на метода: Логиката на самия метод се изпълнява.
  3. Фиксиране или отмяна на транзакцията:
    • Ако методът завърши успешно без изключения (по подразбиране само 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 обикновено се използва в конфигурационен клас, за да активира декларативното управление на транзакциите.