Sobes.tech
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:

  1. Start van de transactie: Voordat de geannoteerde methode wordt uitgevoerd, wordt een nieuwe transactie geopend of een bestaande gebruikt.
  2. Uitvoering van de methode: De logica van de methode zelf wordt uitgevoerd.
  3. 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).

Belangrijke attributen van de annotatie:

  • propagation: Bepaalt hoe transacties met elkaar omgaan (bijvoorbeeld, REQUIRED, REQUIRES_NEW, SUPPORTS). Standaard REQUIRED.
  • 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 bij RuntimeException.
  • 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.