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

  1. Transaktsiooni algus: Enne annoteritud meetodi täitmist avatakse uus transaktsioon või kasutatakse olemasolevat.
  2. Meetodi täitmine: Meetodi loogika täidetakse.
  3. 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).

Peamised annotatsiooni atribuudid:

  • propagation: Määrab, kuidas transaktsioonid omavahel suhtlevad (näiteks REQUIRED, REQUIRES_NEW, SUPPORTS). Vaikimisi on REQUIRED.
  • isolation: Määrab transaktsiooni isoleerimisastme, et vältida andmetele paralleelset juurdepääsu probleeme (näiteks READ_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 on RuntimeException.
  • 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.