Zastanów się nad witryną e-commerce, w której Alice i Bob edytują listę produktów. Alice poprawia opisy, a Bob aktualizuje ceny. Jednocześnie rozpoczynają edycję widgetu Acme Wonder. Bob kończy jako pierwszy i zapisuje produkt w nowej cenie. Alice potrzebuje nieco więcej czasu na aktualizację opisu, a kiedy skończy, zapisuje produkt z nowym opisem. Niestety, ona również zastępuje cenę starą, która nie była zamierzona.
Z mojego doświadczenia wynika, że te problemy są niezwykle powszechne w aplikacjach internetowych. Niektóre oprogramowanie (np. Oprogramowanie wiki) ma ochronę przed tym - zwykle drugie zapisywanie kończy się niepowodzeniem z informacją, że „strona została zaktualizowana podczas edycji”. Ale większość stron internetowych nie ma tej ochrony.
Warto zauważyć, że metody kontrolerów same w sobie są bezpieczne dla wątków. Zwykle używają transakcji bazy danych, co czyni je bezpiecznymi w tym sensie, że jeśli Alice i Bob spróbują zaoszczędzić dokładnie w tym samym momencie, nie spowoduje to uszkodzenia. Wyścig wynika z faktu, że Alice lub Bob mają nieaktualne dane w przeglądarce.
Jak możemy zapobiec takim warunkom wyścigowym? W szczególności chciałbym wiedzieć:
- Jakie techniki można zastosować? np. śledzenie czasu ostatniej zmiany. Jakie są zalety i wady każdego z nich.
- Jaka jest wygodna obsługa?
- Jakie ramy mają wbudowaną tę ochronę?