Middle
Τι σημαίνει η σημείωση @Transactional στο Spring Data;
sobes.tech AI
Απάντηση από AI
Η σημείωση @Transactional στο Spring Data υποδεικνύει ότι μια μέθοδος ή μια κλάση πρέπει να εκτελείται εντός μιας συναλλαγής. Το Spring AOP (Aspect-Oriented Programming) δημιουργεί ένα proxy αντικείμενο γύρω από αυτήν τη μέθοδο, το οποίο διαχειρίζεται τον κύκλο ζωής της συναλλαγής.
Οι βασικές ενέργειες που πραγματοποιούνται από το @Transactional:
- Έναρξη της συναλλαγής: Πριν από την εκτέλεση της σημειωμένης μεθόδου, ανοίγει μια νέα συναλλαγή ή χρησιμοποιείται μια υπάρχουσα.
- Εκτέλεση της μεθόδου: Η λογική της ίδιας της μεθόδου εκτελείται.
- Επικύρωση ή αναίρεση της συναλλαγής:
- Αν η μέθοδος ολοκληρωθεί με επιτυχία χωρίς εξαιρέσεις (κατά προεπιλογή μόνο
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 χρησιμοποιείται συνήθως σε μια κλάση διαμόρφωσης για να ενεργοποιήσει την υποστήριξη για δηλωτικό διαχείριση συναλλαγών.