Sobes.tech
Middle

Čo znamená anotácia @Transactional v Spring Data?

sobes.tech AI

Odpoveď od AI

Anotácia @Transactional v Spring Data označuje, že metóda alebo trieda by mala byť vykonávaná v rámci transakcie. Spring AOP (Aspect-Oriented Programming) vytvára okolo takejto metódy proxy-objekt, ktorý riadi životný cyklus transakcie.

Hlavné akcie vykonávané @Transactional:

  1. Začiatok transakcie: Pred vykonaním anotovanej metódy sa otvorí nová transakcia alebo sa použije existujúca.
  2. Vykonanie metódy: Logika samotnej metódy sa vykonáva.
  3. Záväzok alebo vrátenie transakcie:
    • Ak metóda úspešne skončí bez výnimiek (predvolene iba RuntimeException), transakcia sa potvrdí (commit).
    • Ak metóda vyhodí výnimku (predvolene RuntimeException), transakcia sa zruší (rollback).

Hlavné atribúty anotácie:

  • propagation: Určuje, ako transakcie komunikujú medzi sebou (napríklad REQUIRED, REQUIRES_NEW, SUPPORTS). Predvolene je REQUIRED.
  • isolation: Určuje úroveň izolácie transakcie, aby sa predišlo problémom s paralelným prístupom k údajom (napríklad READ_COMMITTED, REPEATABLE_READ). Predvolene je úroveň izolácie databázy.
  • readOnly: Uvádza, že transakcia by mala byť vykonávaná v režime iba na čítanie. Optimalizuje výkon pri čítaní.
  • timeout: Nastavuje maximálny čas vykonávania transakcie pred automatickým zrušením.
  • rollbackFor: Uvádza zoznam typov výnimiek, pri ktorých má dôjsť k zrušeniu transakcie. Predvolene je RuntimeException.
  • noRollbackFor: Uvádza zoznam typov výnimiek, pri ktorých sa zrušenie transakcie ne má vykonať.

Príklad použitia:

// Príklad servisnej vrstvy
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional // Táto metóda bude vykonávaná v transakcii
    public User createUser(User user) {
        // Logika vytvárania používateľa, môže zahŕňať niekoľko operácií s DB
        userRepository.save(user);
        // Môže byť aj iná operácia uloženia alebo aktualizácie
        // userRepository.updateRelatedInfo(user.getId(), ...);
        return user;
    }

    @Transactional(readOnly = true) // Len na čítanie, optimalizácia
    public User findUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    @Transactional(rollbackFor = CustomBusinessException.class) // Zrušenie pri určitej výnimke
    public void performCriticalOperation(Long userId) throws CustomBusinessException {
        // Logika kritickej operácie
        // Môže vyhodiť CustomBusinessException
    }
}

Anotácia @EnableTransactionManagement sa zvyčajne používa v konfiguračnej triede na povolenie deklaratívneho riadenia transakcií.