Sobes.tech
Junior — Middle

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).