Considere un sitio de comercio electrónico, donde Alice y Bob están editando las listas de productos. Alice está mejorando las descripciones, mientras que Bob está actualizando los precios. Comienzan a editar Acme Wonder Widget al mismo tiempo. Bob termina primero y guarda el producto con el nuevo precio. Alice tarda un poco más en actualizar la descripción, y cuando termina, guarda el producto con su nueva descripción. Desafortunadamente, ella también sobrescribe el precio con el precio anterior, que no estaba previsto.
En mi experiencia, estos problemas son extremadamente comunes en las aplicaciones web. Algunos programas (p. Ej., Software wiki) tienen protección contra esto; por lo general, el segundo guardado falla con "la página se actualizó mientras estaba editando". Pero la mayoría de los sitios web no tienen esta protección.
Vale la pena señalar que los métodos del controlador son seguros para subprocesos en sí mismos. Usualmente usan transacciones de bases de datos, lo que las hace seguras en el sentido de que si Alice y Bob intentan ahorrar en el mismo momento preciso, no causarán corrupción. La condición de carrera surge de que Alice o Bob tienen datos obsoletos en su navegador.
¿Cómo podemos prevenir tales condiciones de carrera? En particular, me gustaría saber:
- ¿Qué técnicas se pueden usar? por ejemplo, rastrear el tiempo del último cambio Cuáles son los pros y los contras de cada uno.
- ¿Qué es una experiencia útil para el usuario?
- ¿En qué marcos se ha incorporado esta protección?