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.