Sobes.tech
Middle

Čo je anotácia @Transactional v kontexte Javy?

sobes.tech AI

Odpoveď od AI

Anotácia @Transactional v Jave sa používa na deklaratívne riadenie transakcií. Umožňuje definovať hranice transakcií, určením, ktoré metódy by mali byť vykonávané v rámci jednej transakcie.

Hlavné aspekty:

  • Integrácia: Najčastejšie sa používa v kombinácii so Spring Framework, EJB alebo inými rámcami poskytujúcimi riadenie transakcií.
  • Proxy: Rámec vytvára proxy objekt, ktorý obaluje cieľový objekt s anotovanými metódami. Pred volaním anotovanej metódy proxy začína transakciu, a po jej vykonaní ju buď potvrdí, alebo vráti späť v závislosti od výsledku (či bolo vyvolané výnimka).
  • Atribúty: Má rôzne atribúty na nastavenie správania transakcie, ako sú:
    • propagation: určuje, ako sa má správať transakčná metóda pri volaní z iného transakčného kontextu. Napríklad, REQUIRED, REQUIRES_NEW, SUPPORTS, NOT_SUPPORTED, NEVER, MANDATORY.
    • isolation: určuje úroveň izolácie pre transakciu. Napríklad, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE.
    • readOnly: označuje, že transakcia sa vykonáva iba na čítanie dát, čo niekedy umožňuje optimalizáciu výkonu.
    • timeout: nastavuje čas čakania na transakciu.
    • rollbackFor a noRollbackFor: určujú, pri ktorých výnimkách má byť transakcia vrátená alebo nie.

Príklad použitia:

// Príklad použitia v Spring
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    // Tento metóda bude vykonávaná v rámci transakcie
    @Transactional
    public void createUser() {
        // Logika vytvárania používateľa a uloženia do databázy
        // Ak je vyvolaná RuntimeException, Spring vráti transakciu
    }

    // Tento metóda bude vykonávaná v rámci transakcie s určitými nastaveniami
    @Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
    public User findUserById(Long id) {
        // Logika vyhľadávania používateľa
        return null; // Príklad
    }
}

@Transactional zjednodušuje riadenie transakcií, umožňujúc vývojárovi sústrediť sa na biznis logiku, nie na nízkoúrovňové API riadenia transakcií (napríklad JTA alebo JDBC Connection).