Considere um site de comércio eletrônico, onde Alice e Bob estão editando as listagens de produtos. Alice está melhorando as descrições, enquanto Bob está atualizando os preços. Eles começam a editar o Acme Wonder Widget ao mesmo tempo. Bob termina primeiro e salva o produto com o novo preço. Alice demora um pouco mais para atualizar a descrição e, quando termina, ela salva o produto com sua nova descrição. Infelizmente, ela também substitui o preço pelo preço antigo, que não era o pretendido.
Na minha experiência, esses problemas são extremamente comuns em aplicativos da web. Alguns softwares (por exemplo, software wiki) têm proteção contra isso - geralmente o segundo salvamento falha com "a página foi atualizada enquanto você estava editando". Mas a maioria dos sites não tem essa proteção.
Vale a pena notar que os métodos do controlador são seguros por thread. Geralmente eles usam transações de banco de dados, o que as torna seguras no sentido de que, se Alice e Bob tentarem salvar exatamente no mesmo momento, isso não causará corrupção. A condição de corrida surge de Alice ou Bob terem dados obsoletos em seu navegador.
Como podemos evitar essas condições de corrida? Em particular, eu gostaria de saber:
- Quais técnicas podem ser usadas? por exemplo, rastreando a hora da última alteração. Quais são os prós e contras de cada um.
- O que é uma experiência útil para o usuário?
- Em quais estruturas essa proteção foi incorporada?