Sobes.tech
Middle

Ce înseamnă adnotarea @Transactional în Spring Data?

sobes.tech AI

Răspuns de la AI

Atenția @Transactional în Spring Data indică faptul că o metodă sau o clasă trebuie să fie executată în cadrul unei tranzacții. Spring AOP (Programare Orientată pe Aspecte) creează un obiect proxy în jurul acestei metode, care gestionează ciclul de viață al tranzacției.

Acțiunile principale realizate de @Transactional:

  1. Începutul tranzacției: Înainte de executarea metodei annotate, se deschide o tranzacție nouă sau se utilizează una existentă.
  2. Executarea metodei: Logica metodei în sine este executată.
  3. Confirmarea sau rollback-ul tranzacției:
    • Dacă metoda se încheie cu succes fără excepții (în mod implicit doar RuntimeException), tranzacția este confirmată (commit).
    • Dacă se aruncă o excepție din metodă (în mod implicit RuntimeException), tranzacția este anulată (rollback).

Atributele principale ale adnotării:

  • propagation: Definește modul în care tranzacțiile interacționează între ele (de exemplu, REQUIRED, REQUIRES_NEW, SUPPORTS). În mod implicit, REQUIRED.
  • isolation: Definește nivelul de izolare al tranzacției pentru a preveni problemele de acces paralel la date (de exemplu, READ_COMMITTED, REPEATABLE_READ). În mod implicit, se folosește nivelul de izolare al bazei de date.
  • readOnly: Indică faptul că tranzacția trebuie să fie executată în modul doar pentru citire. Optimizează performanța pentru citiri.
  • timeout: Setează timpul maxim de execuție al tranzacției înainte de rollback automat.
  • rollbackFor: Indică lista de tipuri de excepții care, în cazul apariției, trebuie să determine rollback-ul tranzacției. În mod implicit, se face rollback pentru RuntimeException.
  • noRollbackFor: Indică lista de tipuri de excepții care, în cazul apariției, nu trebuie să determine rollback-ul.

Exemplu de utilizare:

// Exemplu de strat de serviciu
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional // Această metodă va fi executată în cadrul unei tranzacții
    public User createUser(User user) {
        // Logica de creare a utilizatorului, posibil să includă mai multe operații cu BD
        userRepository.save(user);
        // Poate exista o altă operație de salvare sau actualizare
        // userRepository.updateRelatedInfo(user.getId(), ...);
        return user;
    }

    @Transactional(readOnly = true) // Metodă doar pentru citire, optimizare
    public User findUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    @Transactional(rollbackFor = CustomBusinessException.class) // Rollback pentru excepție personalizată
    public void performCriticalOperation(Long userId) throws CustomBusinessException {
        // Logica operației critice
        // Poate arunca CustomBusinessException
    }
}

Adnotarea @EnableTransactionManagement de obicei este utilizată într-o clasă de configurare pentru a activa suportul pentru gestionarea tranzacțiilor declarative.