O que é condição de corrida
Condição de corrida acontece quando duas ou mais operações disputam o mesmo recurso e o resultado depende da ordem de conclusão delas. Cada tentativa parece correta quando executada isoladamente, mas a combinação produz um efeito indevido.
O caso clássico é a leitura seguida de gravação. Uma operação consulta o estado, decide com base no que leu e grava. Se outra operação faz o mesmo no intervalo entre a leitura e a gravação, as duas escolhas se baseiam em uma informação que deixou de valer.
Consulta seguida de gravação
Considere um sistema de reserva de salas com horários fixos. A aplicação consulta se a sala está livre às dez e, em seguida, registra a ocupação. Uma tentativa isolada conclui as duas etapas e mostra a confirmação na tela.
Duas solicitações podem realizar a consulta enquanto o horário ainda está livre. Ambas recebem uma resposta positiva e tentam gravar a ocupação. O resultado depende de como a implementação e o banco tratam essa disputa, e não da aparência do formulário.
A restrição que impede a duplicação
A correção não está em confiar na consulta anterior, e sim em impedir a gravação conflitante. Uma restrição de unicidade no banco, combinada com o tratamento do erro na aplicação, recusa a segunda tentativa mesmo quando as duas chegam juntas.
Reservas por intervalos de duração exigem um cuidado maior, porque dois horários de início diferentes podem ocupar parte do mesmo período. Nesse caso, a verificação precisa considerar a sobreposição entre os intervalos, sem se limitar à igualdade do horário.
Reproduzir a disputa no teste
Um teste que executa as reservas em sequência não reproduz a disputa. Ele exercita a leitura de uma ocupação já registrada e pode passar mesmo em uma implementação que aceitaria duas gravações simultâneas.
Para investigar, o cenário precisa acionar as solicitações ao mesmo tempo. O resultado esperado também precisa estar definido: uma confirmação e uma recusa preservam a única ocupação, enquanto duas confirmações mostram que a falha foi reproduzida. O teste de caixa-preta ajuda a comparar a resposta das duas tentativas e o estado gravado depois delas.
Sinais de que a correção funcionou
Depois da correção, execute novamente o cenário simultâneo e confira o registro final. O cliente cuja tentativa perdeu a disputa precisa receber uma explicação e conseguir escolher outro horário, sem receber apenas uma mensagem genérica de erro.
O cancelamento também merece atenção, porque devolve um horário à disponibilidade. A transação e a atomicidade ajudam a garantir que a leitura e a gravação aconteçam de forma coerente. Para investigar a disputa e revisar a restrição aplicada, o Desenvolvimento Colaborativo da Dev Side Studio permite reproduzir o cenário durante a execução.
Dúvidas frequentes
Perguntas frequentes sobre Condição de corrida
- Condição de corrida é o mesmo que concorrência?
- Não. A [concorrência](/glossario/concorrencia/) descreve várias operações em andamento ao mesmo tempo. A condição de corrida é um efeito possível dessa concorrência, quando a ordem das operações altera o resultado final.
- Basta validar o formulário no navegador?
- Não. A verificação feita na tela não impede que duas chamadas cheguem ao servidor quase ao mesmo tempo. A proteção precisa existir onde a gravação acontece, para que a segunda tentativa seja recusada.
- Uma consulta antes de gravar resolve a disputa?
- Não sozinha. Duas tentativas podem consultar o recurso enquanto ele ainda está livre e gravar logo depois. A consulta informa o estado em um instante, e a gravação precisa confirmar que o recurso continua disponível no momento de ocupá-lo.
- Como reproduzir a disputa em um teste?
- O teste precisa exercitar as solicitações ao mesmo tempo, e não em sequência. Executar duas reservas uma após a outra verifica apenas a leitura de uma ocupação já gravada e pode passar mesmo em uma implementação que aceita duplicação.
Para continuar
Recursos relacionados
Site de referência
Wikipedia: condição de corrida
Define a condição de corrida, o acesso concorrente ao estado compartilhado e as formas de evitá-la.
Abrir recursoDocumentação
PostgreSQL: níveis de isolamento de transação
Explica como os níveis de isolamento tratam leituras concorrentes e atualizações conflitantes.
Abrir recursoAplicação na formação
Developer Workspace
A condição de corrida mostra por que uma verificação feita só na interface não impede duas gravações conflitantes no banco.
Conhecer a formação
Fontes consultadas
Referências deste verbete
Este verbete ajudou você?
Obrigado pela resposta. Ela fica salva apenas neste navegador.