Sobes.tech
Middle

Τι σημαίνει η σημείωση @Transactional στο Spring Data;

sobes.tech AI

Απάντηση από AI

Η σημείωση @Transactional στο Spring Data υποδεικνύει ότι μια μέθοδος ή μια κλάση πρέπει να εκτελείται εντός μιας συναλλαγής. Το Spring AOP (Aspect-Oriented Programming) δημιουργεί ένα proxy αντικείμενο γύρω από αυτήν τη μέθοδο, το οποίο διαχειρίζεται τον κύκλο ζωής της συναλλαγής.

Οι βασικές ενέργειες που πραγματοποιούνται από το @Transactional:

  1. Έναρξη της συναλλαγής: Πριν από την εκτέλεση της σημειωμένης μεθόδου, ανοίγει μια νέα συναλλαγή ή χρησιμοποιείται μια υπάρχουσα.
  2. Εκτέλεση της μεθόδου: Η λογική της ίδιας της μεθόδου εκτελείται.
  3. Επικύρωση ή αναίρεση της συναλλαγής:
    • Αν η μέθοδος ολοκληρωθεί με επιτυχία χωρίς εξαιρέσεις (κατά προεπιλογή μόνο RuntimeException), η συναλλαγή επικυρώνεται (commit).
    • Αν προκληθεί μια εξαίρεση από τη μέθοδο (κατά προεπιλογή RuntimeException), η συναλλαγή ανακαλείται (rollback).

Βασικά χαρακτηριστικά της σημείωσης:

  • propagation: Ορίζει πώς αλληλεπιδρούν οι συναλλαγές μεταξύ τους (π.χ., REQUIRED, REQUIRES_NEW, SUPPORTS). Κατά προεπιλογή, REQUIRED.
  • isolation: Ορίζει το επίπεδο απομόνωσης της συναλλαγής για την αποφυγή προβλημάτων παράλληλης πρόσβασης στα δεδομένα (π.χ., READ_COMMITTED, REPEATABLE_READ). Κατά προεπιλογή, χρησιμοποιείται το επίπεδο απομόνωσης της βάσης δεδομένων.
  • readOnly: Υποδεικνύει ότι η συναλλαγή πρέπει να εκτελείται σε λειτουργία μόνο ανάγνωσης. Βελτιστοποιεί την απόδοση για αναγνώσεις.
  • timeout: Ορίζει το μέγιστο χρόνο εκτέλεσης της συναλλαγής πριν από αυτόματη αναίρεση.
  • rollbackFor: Υποδεικνύει τη λίστα τύπων εξαιρέσεων που, όταν προκύψουν, πρέπει να προκαλέσουν αναίρεση της συναλλαγής. Κατά προεπιλογή, αναίρεση σε RuntimeException.
  • noRollbackFor: Υποδεικνύει τη λίστα τύπων εξαιρέσεων που, όταν προκύψουν, δεν πρέπει να προκαλέσουν αναίρεση.

Παράδειγμα χρήσης:

// Παράδειγμα επιπέδου υπηρεσίας
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional // Αυτή η μέθοδος θα εκτελείται εντός συναλλαγής
    public User createUser(User user) {
        // Λογική δημιουργίας χρήστη, πιθανώς περιλαμβάνει πολλές λειτουργίες με τη βάση δεδομένων
        userRepository.save(user);
        // Μπορεί να υπάρχει άλλη λειτουργία αποθήκευσης ή ενημέρωσης
        // userRepository.updateRelatedInfo(user.getId(), ...);
        return user;
    }

    @Transactional(readOnly = true) // Μόνο για ανάγνωση, βελτιστοποίηση
    public User findUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    @Transactional(rollbackFor = CustomBusinessException.class) // Αναίρεση σε περίπτωση εξαίρεσης
    public void performCriticalOperation(Long userId) throws CustomBusinessException {
        // Λογική κρίσιμης λειτουργίας
        // Μπορεί να ρίξει CustomBusinessException
    }
}

Η σημείωση @EnableTransactionManagement χρησιμοποιείται συνήθως σε μια κλάση διαμόρφωσης για να ενεργοποιήσει την υποστήριξη για δηλωτικό διαχείριση συναλλαγών.