Sobes.tech
Junior — Middle

Como se comporta uma chamada de método anotado com @Transactional dentro de outro método com a mesma anotação?

sobes.tech IA

Resposta da IA

No Spring Framework, a anotação @Transactional funciona através de proxies que envolvem as chamadas de métodos para gerenciar transações. Se um método com @Transactional chama diretamente outro método com @Transactional dentro da mesma classe (ou seja, através de this), o proxy não intercepta essa chamada interna, e a anotação no método interno não será aplicada separadamente.

Isso significa que, se o método externo já iniciou uma transação, o método interno será executado dentro dessa mesma transação, e suas próprias configurações @Transactional (por exemplo, propagation ou isolation) não serão aplicadas.

Se a chamada ocorrer através de um proxy (por exemplo, de outro bean), então as configurações @Transactional do método interno serão consideradas.

Exemplo:

@Service
public class MyService {

    @Transactional
    public void outerMethod() {
        // a transação começa aqui
        innerMethod(); // chamada direta, o proxy não será acionado
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void innerMethod() {
        // este método não abrirá uma nova transação ao ser chamado de outerMethod
    }
}

Para que o método interno funcione com uma transação separada, ele deve ser chamado através do proxy, por exemplo, injetando o próprio bean MyService e chamando através dele.