PostgreSQLPytanie 07 z 11
Dwa requesty kupują ostatnią sztukę — jak uniknąć wyścigu?
Najpierw odpowiedz na głos lub w myślach, potem porównaj.
Odpowiedź
Nie robię osobnego SELECT, sprawdzenia w JS i bezwarunkowego UPDATE. Sprawdzam dostępność i zmniejszam stan w jednym atomowym poleceniu.
SQL
-- inventory(product_id PRIMARY KEY, stock integer NOT NULL)
UPDATE inventory
SET stock = stock - 1
WHERE product_id = 42 AND stock > 0
RETURNING stock;Wynik: brak zwróconego wiersza oznacza brak produktu lub brak zapasu. Przy domyślnym Read Committed równoległy UPDATE poczeka i ponownie oceni warunek po zmianie konkurenta.
Doprecyzowanie: jeśli zamówienie i magazyn mają być zapisane razem, potrzebna jest transakcja. Alternatywa dla złożonej logiki: SELECT FOR UPDATE i aktualizacja w tej samej transakcji. Wyższa izolacja może wymagać retry.
Jak poszło? Bądź szczery — „Jeszcze nie” dodaje pytanie do powtórki.
Powiązane pytania
- D03 · Dlaczego sama transakcja może nie wystarczyć do ochrony limitu? — Backend, dane i system design