Sobes.tech
Junior — Middle

Hogyan viselkedik egy @Transactional annotációval ellátott metódus hívása, amikor egy másik ugyanilyen annotációval ellátott metódusból hívják?

sobes.tech MI

Válasz az MI-től

A Spring Framework-ben az @Transactional annotáció proxy-kon keresztül működik, amelyek a metódushívásokat körülveszik a tranzakciók kezelésére. Ha egy @Transactional jelölt metódus közvetlenül hív meg egy másik @Transactional metódust ugyanabban a osztályban (azaz, this-en keresztül), akkor a proxy nem fogja elfogni ezt a belső hívást, és a belső metóduson lévő annotáció nem fog külön alkalmazásra kerülni.

Ez azt jelenti, hogy ha a külső metódus már elindított egy tranzakciót, akkor a belső metódus ugyanazon a tranzakción belül fog végrehajtódni, és saját @Transactional beállításai (például propagation vagy isolation) nem fognak érvényesülni.

Ha viszont a hívás proxy-n keresztül történik (például, egy másik bean-ből), akkor a belső metódus @Transactional beállításai figyelembe lesznek véve.

Példa:

@Service
public class MyService {

    @Transactional
    public void outerMethod() {
        // itt kezdődik a tranzakció
        innerMethod(); // közvetlen hívás, proxy nem fog működni
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void innerMethod() {
        // ez a metódus nem fog új tranzakciót nyitni, ha az outerMethod-ből hívják
    }
}

Annak érdekében, hogy a belső metódus külön tranzakcióval működjön, proxy-n keresztül kell hívni, például, a saját bean injektálásával és azon keresztül való hívással.