Na bankiecie w Antalya Belek dla 1200 osób czterech kelnerów jednocześnie dodaje dania do tego samego okrągłego stołu dla 20 osób. Klasyczny "last-write-wins" po cichu nadpisuje 14 pozycji. Oto jak wdrożyliśmy optimistic locking, 409 Conflict i wzorzec retry w produkcji.
Dlaczego last-write-wins nie wystarczy
Proste UPDATE orders SET items = ? WHERE id = ? zostawia tylko ostatni commit. Cztery POST-y w 200ms — kuchnia widzi 6 z 20 dań.
Rozwiązanie: kolumna version w każdym wierszu. Klient czyta ją przy otwarciu, odsyła przy zapisie, serwer weryfikuje atomowo.
Optimistic locking z wersjonowaniem
Dodaj version INTEGER i updated_at. PATCH:
- Klient:
{ items, expected_version: 7 }. - Serwer:
UPDATE ... WHERE id = ? AND version = 7. - 0 wierszy →
409 Conflict+ aktualny stan.
409 Conflict + merge po stronie klienta
Bez auto-retry. Klient pokazuje aktualne zamówienie, wyróżnia zmiany i prosi o potwierdzenie. W Beleku odczuwalna liczba konfliktów spadła z 0,4% do 0%.
Append-only log order_events ułatwia audyt.
FAQ
Dlaczego nie SELECT FOR UPDATE? Serializuje kelnerów i tnie przepustowość.
Działa na D1? Tak, atomowy UPDATE na INTEGER jest bezpieczny.
A offline? Lokalna kolejka + expected_version, merge przy reconnect.
Czy to było pomocne? Udostępnij.
Powiązane artykuły
Czym jest menu QR? Kompletny przewodnik dla restauracji
Menu QR umożliwia klientom natychmiastowy dostęp do karty dań przez smartfon — b…
Przejście z papierowego na cyfrowe menu QR: przewodnik krok po kroku
Chcesz wdrożyć menu QR, ale nie wiesz od czego zacząć? Ten przewodnik obejmuje f…
Geo-targetowane menu QR: różne języki w zależności od IP gościa
Jak resort all-inclusive na 180 miejsc w Antalyi kieruje ten sam kod QR do menu …