Middle
Mida tähendab @Transactional annotatsioon Spring Data'is?
sobes.tech AI
Vastus AI-lt
@Transactional annotatsioon Spring Data-s näitab, et meetod või klass peaks toimuma transaktsiooni raames. Spring AOP (Aspect-Oriented Programming) loob selle meetodi ümber proxy-objekti, mis haldab transaktsiooni elutsüklit.
Peamised tegevused, mida @Transactional teostab:
- Transaktsiooni algus: Enne annoteritud meetodi täitmist avatakse uus transaktsioon või kasutatakse olemasolevat.
- Meetodi täitmine: Meetodi loogika täidetakse.
- Transaktsiooni kinnitamine või tühistamine:
- Kui meetod lõpeb edukalt ilma eranditeta (vaikimisi ainult
RuntimeException), kinnitatakse transaktsioon (commit). - Kui meetod viskab erandi (vaikimisi
RuntimeException), tühistatakse transaktsioon (rollback).
- Kui meetod lõpeb edukalt ilma eranditeta (vaikimisi ainult
Peamised annotatsiooni atribuudid:
propagation: Määrab, kuidas transaktsioonid omavahel suhtlevad (näiteksREQUIRED,REQUIRES_NEW,SUPPORTS). Vaikimisi onREQUIRED.isolation: Määrab transaktsiooni isoleerimisastme, et vältida andmetele paralleelset juurdepääsu probleeme (näiteksREAD_COMMITTED,REPEATABLE_READ). Vaikimisi on andmebaasi isoleerimisaste.readOnly: Näitab, et transaktsioon peaks toimuma ainult lugemisrežiimis. Optimeerib lugemise jõudlust.timeout: Määrab maksimaalse aja, mille jooksul transaktsioon võib täita, enne automaatset tühistamist.rollbackFor: Näitab eranditüüpide nimekirja, mille korral transaktsioon tuleks tühistada. Vaikimisi onRuntimeException.noRollbackFor: Näitab eranditüüpide nimekirja, mille korral transaktsiooni ei tule tühistada.
Kasutusnäide:
// Teenuse kihi näide
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Transactional // See meetod täidetakse transaktsioonis
public User createUser(User user) {
// Kasutaja loomise loogika, mis võib hõlmata mitmeid operatsioone andmebaasiga
userRepository.save(user);
// Võib olla ka teine salvestus- või uuendusoperatsioon
// userRepository.updateRelatedInfo(user.getId(), ...);
return user;
}
@Transactional(readOnly = true) // Ainult lugemiseks, optimeerimiseks
public User findUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
@Transactional(rollbackFor = CustomBusinessException.class) // Tühistamine teatud erandi korral
public void performCriticalOperation(Long userId) throws CustomBusinessException {
// Kritilise operatsiooni loogika
// Võib visata CustomBusinessException
}
}
@EnableTransactionManagement annotatsioon on tavaliselt kasutusel konfiguratsiooniklassis, et lubada deklaratiivset transaktsioonide haldamist.