Sobes.tech
Middle

Mi az a @Transactional annotáció a Java kontextusában?

sobes.tech MI

Válasz az MI-től

A @Transactional annotáció Java-ban deklaratív tranzakciókezelésre szolgál. Lehetővé teszi a tranzakciók határainak meghatározását, jelezve, hogy mely metódusok fussanak ugyanazon tranzakció keretében.

Főbb szempontok:

  • Integráció: Leggyakrabban a Spring Framework, EJB vagy más tranzakciókezelést biztosító keretrendszerekkel együtt használják.
  • Proxy: A keretrendszer létrehoz egy proxy objektumot, amely körülveszi a céltárgyat annotált metódusokkal. Az annotált metódus hívása előtt a proxy elindítja a tranzakciót, és annak végrehajtása után megerősíti vagy visszavonja a kimenet eredményétől függően (ha kivétel keletkezik).
  • Attribútumok: Számos attribútum áll rendelkezésre a tranzakció viselkedésének konfigurálására, például:
    • propagation: meghatározza, hogy egy tranzakciós metódus hogyan viselkedjen, ha egy másik tranzakciós kontextusból hívják. Például, REQUIRED, REQUIRES_NEW, SUPPORTS, NOT_SUPPORTED, NEVER, MANDATORY.
    • isolation: meghatározza a tranzakció izolációs szintjét. Például, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE.
    • readOnly: jelzi, hogy a tranzakció csak olvasási műveleteket végez, ami néha optimalizálhatja a teljesítményt.
    • timeout: beállítja a tranzakció várakozási idejét.
    • rollbackFor és noRollbackFor: megadják, hogy mely kivételeknél kell visszavonni a tranzakciót, illetve mikor nem.

Használati példa:

// Spring-ben példa
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    // Ez a metódus tranzakció keretében fog futni
    @Transactional
    public void createUser() {
        // Felhasználó létrehozása és mentése az adatbázisba
        // Ha RuntimeException keletkezik, a Spring visszavonja a tranzakciót
    }

    // Ez a metódus tranzakció keretében fut, bizonyos beállításokkal
    @Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
    public User findUserById(Long id) {
        // Felhasználó keresése
        return null; // Példa
    }
}

A @Transactional egyszerűsíti a tranzakciók kezelését, lehetővé téve a fejlesztő számára, hogy a üzleti logikára összpontosítson, és ne kelljen a tranzakciókezelés alacsony szintű API-jával foglalkoznia (pl. JTA vagy JDBC Connection).