Como se comporta o sistema se dentro de um método marcado como transacional, outro método também marcado com a anotação transacional for chamado?
sobes.tech IA
Resposta da IA
Em Java, ao usar transações (por exemplo, com a anotação @Transactional no Spring), se dentro de um método transacional chamar outro método também marcado como transacional, o comportamento depende do tipo de proxy e das configurações de transação.
Por padrão, se a chamada ocorre dentro da mesma classe (chamada interna de método), o proxy não intercepta essa chamada, e uma nova transação não é criada — a transação atual (se existir) é usada.
Se a chamada ocorre de fora (através do proxy), então:
- Com propagation do tipo
REQUIRED(padrão), nenhuma transação interna é criada, a transação existente é usada. - Com propagation
REQUIRES_NEW, uma nova transação é criada, suspendendo a atual.
Assim, ao chamar um método transacional de outro método transacional na mesma classe, geralmente, a mesma transação é usada, e a anotação aninhada não cria uma nova transação.
Se desejar que o método interno seja executado em uma transação separada, a chamada deve passar pelo proxy (por exemplo, através de outro bean ou por auto-injeção).