Middle
Wat betekent de annotatie @Transactional in Spring Data?
sobes.tech AI
Antwoord van AI
De annotatie @Transactional in Spring Data geeft aan dat een methode of klasse binnen een transactie moet worden uitgevoerd. Spring AOP (Aspect-Oriented Programming) creëert een proxy-object rond zo'n methode, dat de levenscyclus van de transactie beheert.
De belangrijkste acties die door @Transactional worden uitgevoerd:
- Start van de transactie: Voordat de geannoteerde methode wordt uitgevoerd, wordt een nieuwe transactie geopend of een bestaande gebruikt.
- Uitvoering van de methode: De logica van de methode zelf wordt uitgevoerd.
- Bevestiging of rollback van de transactie:
- Als de methode succesvol eindigt zonder uitzonderingen (standaard alleen
RuntimeException), wordt de transactie bevestigd (commit). - Als er een uitzondering wordt gegooid vanuit de methode (standaard
RuntimeException), wordt de transactie teruggedraaid (rollback).
- Als de methode succesvol eindigt zonder uitzonderingen (standaard alleen
Belangrijke attributen van de annotatie:
propagation: Bepaalt hoe transacties met elkaar omgaan (bijvoorbeeld,REQUIRED,REQUIRES_NEW,SUPPORTS). StandaardREQUIRED.isolation: Bepaalt het isolatieniveau van de transactie om problemen met gelijktijdige toegang tot gegevens te voorkomen (bijvoorbeeld,READ_COMMITTED,REPEATABLE_READ). Standaard wordt het isolatieniveau van de database gebruikt.readOnly: Geeft aan dat de transactie in alleen-lezen modus moet worden uitgevoerd. Optimaliseert de prestaties voor leesbewerkingen.timeout: Stelt de maximale uitvoeringstijd van de transactie in voordat een automatische rollback plaatsvindt.rollbackFor: Geeft de lijst van uitzonderings-typen aan die, bij optreden, een rollback van de transactie moeten veroorzaken. Standaard wordt gerollbackt bijRuntimeException.noRollbackFor: Geeft de lijst van uitzonderings-typen aan die, bij optreden, niet moeten leiden tot een rollback.
Voorbeeld van gebruik:
// Voorbeeld van service-laag
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Transactional // Deze methode wordt uitgevoerd binnen een transactie
public User createUser(User user) {
// Logica voor het aanmaken van een gebruiker, mogelijk met meerdere DB-operaties
userRepository.save(user);
// Kan een andere opslag- of update-operatie bevatten
// userRepository.updateRelatedInfo(user.getId(), ...);
return user;
}
@Transactional(readOnly = true) // Alleen-lezen methode, optimalisatie
public User findUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
@Transactional(rollbackFor = CustomBusinessException.class) // Rollback bij aangepaste uitzondering
public void performCriticalOperation(Long userId) throws CustomBusinessException {
// Logica van kritische operatie
// Kan CustomBusinessException gooien
}
}
De annotatie @EnableTransactionManagement wordt meestal gebruikt in een configuratieklasse om ondersteuning voor declaratief transactiebeheer in te schakelen.