Sobes.tech
Middle+

Čo je propagácia a rozširovanie transakcií v Jave?

sobes.tech AI

Odpoveď od AI

Propagácia (šírenie) transakcií v Jave určuje, ako sa transakčný kontext šíri medzi metódami. Pri volaní transakčnej metódy z inej (transakčnej alebo nie), pravidlo propagácie rozhodne, či sa má použiť existujúca transakcia, vytvoriť nová alebo sa má správať inak.

Najčastejšie pravidlá propagácie v Spring Framework:

  • REQUIRED: Ak existuje aktívna transakcia, použije sa. Ak nie, vytvorí sa nová. Toto pravidlo je predvolené.
  • SUPPORTS: Použije sa existujúca transakcia, ak je. Ak nie, vykoná sa kód bez transakcie.
  • MANDATORY: Použije sa existujúca transakcia. Ak nie, vyhodí sa výnimka.
  • REQUIRES_NEW: Vždy vytvorí novú, nezávislú transakciu. Ak je aktívna transakcia, tá sa pozastaví.
  • NOT_SUPPORTED: Vykoná sa kód bez transakcie. Ak je aktívna transakcia, tá sa pozastaví.
  • NEVER: Vykoná sa kód bez transakcie. Ak je aktívna transakcia, vyhodí sa výnimka.
  • NESTED: Ak existuje aktívna transakcia, vytvorí "vnorenú" transakciu (savepoint). Ak nie, správa sa ako REQUIRED. Vnorené transakcie nie sú podporované všetkými SGBD.

Príklad použitia v Spring:

// Príklad použitia anotácie @Transactional s Propagation
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createUserWithIndependentOperation(User user) {
    // Logika vytvárania používateľa

    performIndependentOperation(); // Táto metóda bude vykonaná v novej transakcii
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void performIndependentOperation() {
    // Logika nezávislej operácie
}

Výber pravidla propagácie závisí od požadovanej atomickosti a izolácie operácií. Nesprávne použitie môže viesť k neželanému správaniu, ako je strata zmien alebo zámky.