Pergunta de entrevista para Desenvolvedor Backend

Dois usuários editam o mesmo registro ao mesmo tempo. Como você impede que um sobrescreva o outro em silêncio?

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

Resposta rápida

Use lock otimista na maioria dos casos: dê à linha uma coluna de versão ou timestamp, inclua isso no predicado do update, e se zero linhas forem atualizadas é porque o registro mudou por baixo de você, então retorne um conflito. Use lock pessimista, um select for update dentro de uma transação curta, quando os conflitos são frequentes ou a operação não pode ser repetida com segurança. A única coisa que você não pode fazer é ler, alterar e gravar sem nenhuma checagem.

Por que os entrevistadores perguntam isso

Lost updates são uma classe de corrupção silenciosa de dados que nunca aparece em testes. O entrevistador quer ver que você conhece o risco de ler-alterar-gravar, que escolhe uma estratégia com base em contenção e não em hábito, e que entende as consequências para a experiência do usuário: lock otimista significa que alguém recebe um erro e precisa mesclar, lock pessimista significa que alguém espera e agora você é dono do tempo de vida do lock e do risco de deadlock.

Como estruturar sua resposta

  • Nomeie o risco primeiro: ler-alterar-gravar sem proteção.
  • Descreva o lock otimista mecanicamente, incluindo a checagem de zero linhas.
  • Diga quando a contenção justifica lock pessimista.
  • Cubra o que o usuário vê em caso de conflito.

Exemplo de resposta

Exemplo falado, em primeira pessoa

A falha é ler-alterar-gravar, onde as duas requisições carregam a versão um, as duas calculam a partir de dados velhos e a segunda gravação vence em silêncio. Minha correção padrão é otimista: cada linha tem uma versão, o update diz where id igual a este e version igual ao que eu li, e incrementa a versão. Se o update reportar zero linhas alteradas, alguém chegou antes e eu retorno um 409 em vez de fingir que funcionou. Isso não custa nada quando conflitos são raros, o que normalmente são. Eu troco para lock pessimista quando a contenção é real ou um retry é inaceitável, por exemplo ao decrementar estoque, onde eu pego um select for update na linha, faço a checagem e a gravação numa transação curta e não deixo nenhuma chamada de rede dentro dessa transação. A parte com que mais me importo é o que o usuário vê. Um erro cru de conflito é inútil, então num editor de documentos nós retornávamos a versão atual junto com o erro para o cliente conseguir mostrar um diff em vez de simplesmente perder o trabalho.

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

  • Como você exporia um conflito através da sua API HTTP?
  • Quais são os riscos de segurar um select for update durante uma chamada a outro serviço?
  • Como um ETag com if match se relaciona com lock otimista?

Mais perguntas para Desenvolvedor Backend

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