Prenons un site de commerce électronique, où Alice et Bob modifient tous deux les listes de produits. Alice améliore les descriptions, tandis que Bob met à jour les prix. Ils commencent à éditer le widget Acme Wonder en même temps. Bob termine premier et enregistre le produit avec le nouveau prix. Alice prend un peu plus de temps pour mettre à jour la description, et lorsqu'elle a terminé, elle enregistre le produit avec sa nouvelle description. Malheureusement, elle remplace également le prix par l'ancien prix, ce qui n'était pas prévu.
D'après mon expérience, ces problèmes sont extrêmement courants dans les applications Web. Certains logiciels (par exemple, les logiciels wiki) ont une protection contre cela - généralement la deuxième sauvegarde échoue avec "la page a été mise à jour pendant la modification". Mais la plupart des sites Web ne disposent pas de cette protection.
Il convient de noter que les méthodes du contrôleur sont en soi thread-safe. Habituellement, ils utilisent des transactions de base de données, ce qui les rend sécuritaires dans le sens où si Alice et Bob essaient de sauvegarder au même moment précis, cela ne causera pas de corruption. La condition de concurrence découle du fait qu'Alice ou Bob ont des données périmées dans leur navigateur.
Comment pouvons-nous empêcher de telles conditions de course? J'aimerais en particulier savoir:
- Quelles techniques peuvent être utilisées? par exemple, le suivi de l'heure du dernier changement. Quels sont les avantages et les inconvénients de chacun.
- Qu'est-ce qu'une expérience utilisateur utile?
- Dans quels cadres cette protection est-elle intégrée?