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
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 funcionaPerguntas 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