Pergunta de entrevista para Desenvolvedor Java

Alguém adiciona Transactional a um método e parece não funcionar. Quais são os motivos de sempre?

O que o entrevistador está avaliando, como estruturar sua resposta e um exemplo falado que você pode adaptar.

Resposta rápida

A anotação é implementada com um proxy, então ela só se aplica quando a chamada chega ao bean de fora. Uma chamada vinda de outro método dentro da mesma classe passa por cima do proxy inteiro, e essa é a causa mais comum. Outros motivos: o método não é public, a exceção lançada é checked e por padrão não dispara rollback, o bean foi criado fora do container, ou era preciso uma nova transação e a propagação ficou como required.

Por que os entrevistadores perguntam isso

É uma pergunta prática de Spring com várias respostas corretas, então mostra tanto profundidade quanto experiência real de depuração. O entrevistador quer o problema de autoinvocação via proxy citado primeiro, mais a regra de rollback sobre exceções checked, que surpreende as pessoas. Os follow ups normalmente vão para propagação, para o que pertence dentro de uma transação, e para por que transações longas segurando uma conexão são perigosas.

Como estruturar sua resposta

  • Comece pelo modelo de proxy, já que ele explica a maioria das falhas.
  • Cubra autoinvocação e os requisitos de visibilidade.
  • Enuncie a regra padrão de rollback e como mudá la.
  • Acrescente o que não deveria estar dentro de uma transação.

Exemplo de resposta

Exemplo falado, em primeira pessoa

Nove em cada dez vezes é autoinvocação. O Spring embrulha o bean num proxy, e a transação começa quando alguém passa por esse proxy, então se um método público da mesma classe chama o método anotado diretamente, a chamada nunca sai do objeto e nenhuma transação começa. A correção é mover o método para outro bean ou injetar o bean nele mesmo, e a correção honesta normalmente é que a fronteira estava no lugar errado de qualquer forma. Depois disso eu checo o básico: o método deve ser público, o bean precisa ser gerenciado pelo Spring em vez de criado com new, e a regra de rollback pega as pessoas porque por padrão ela só faz rollback em exceções unchecked, então uma exceção checked commita a menos que eu especifique rollbackFor. Eu também olho a propagação, já que trabalho que precisa sobreviver ao rollback do chamador exige requires new, e isso consome uma segunda conexão, o que importa se o pool é pequeno. E eu mantenho as transações curtas: nada de chamadas HTTP, nada de publicação de mensagens, nada de esperar por algo dentro de uma, porque segurar uma conexão de banco enquanto se chama um terceiro é como um pool se esgota.

Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.

Veja como funciona

Perguntas de acompanhamento que você pode esperar

  • O que a propagação requires new realmente faz com o pool de conexões?
  • Por que capturar uma exceção dentro de uma transação ainda pode causar rollback?
  • Como você publicaria um evento só depois que a transação commitar?

Mais perguntas para Desenvolvedor Java

Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.

Prever minhas perguntas

Ensaie as perguntas difíceis antes que elas apareçam

Pratique com um copiloto ao vivo e depois entre pronto. Um Session Pass de $29 te leva até o fim da entrevista, sem assinatura e sem amarras.

Instalar o GhostPilot