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.