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:
- Začiatok transakcie: Pred vykonaním anotovanej metódy sa otvorí nová transakcia alebo sa použije existujúca.
- Vykonanie metódy: Logika samotnej metódy sa vykonáva.
- 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).
- Ak metóda úspešne skončí bez výnimiek (predvolene iba
Hlavné atribúty anotácie:
propagation: Určuje, ako transakcie komunikujú medzi sebou (napríkladREQUIRED,REQUIRES_NEW,SUPPORTS). Predvolene jeREQUIRED.isolation: Určuje úroveň izolácie transakcie, aby sa predišlo problémom s paralelným prístupom k údajom (napríkladREAD_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 jeRuntimeException.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í.