Stellen Sie sich eine E-Commerce-Site vor, auf der Alice und Bob die Produktlisten bearbeiten. Alice verbessert die Beschreibungen, während Bob die Preise aktualisiert. Gleichzeitig bearbeiten sie das Acme Wonder Widget. Bob beendet zuerst und speichert das Produkt mit dem neuen Preis. Alice braucht etwas länger, um die Beschreibung zu aktualisieren, und wenn sie fertig ist, speichert sie das Produkt mit ihrer neuen Beschreibung. Leider überschreibt sie auch den Preis mit dem alten Preis, der nicht vorgesehen war.
Nach meiner Erfahrung treten diese Probleme in Webanwendungen häufig auf. Einige Softwareprodukte (z. B. Wiki-Software) sind dagegen geschützt. In der Regel schlägt der zweite Speichervorgang mit "Die Seite wurde während der Bearbeitung aktualisiert" fehl. Die meisten Websites verfügen jedoch nicht über diesen Schutz.
Es ist erwähnenswert, dass die Controller-Methoden für sich genommen thread-sicher sind. Normalerweise verwenden sie Datenbanktransaktionen, was sie in dem Sinne sicher macht, dass Alice und Bob, wenn sie im selben Moment versuchen zu speichern, keine Beschädigung verursachen. Die Rennbedingungen sind darauf zurückzuführen, dass Alice oder Bob veraltete Daten in ihrem Browser haben.
Wie können wir solche Rennbedingungen verhindern? Insbesondere würde ich gerne wissen:
- Welche Techniken können verwendet werden? zB Verfolgung des Zeitpunkts der letzten Änderung. Was sind die Vor- und Nachteile von jedem.
- Was ist eine hilfreiche Benutzererfahrung?
- In welchen Frameworks ist dieser Schutz eingebaut?