Blokowanie optymistyczne a pesymistyczne
Porównywać wzorce SELECT ... FOR UPDATE (pesymistyczny) oraz version-column / WHERE updated_at = ? (optymistyczny)
Blokowanie optymistyczne a pesymistyczne to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Dwie strategie współbieżności
- Pesymistyczna — blokuje wiersz podczas odczytu; nikt inny nie może go zmienić
- Optymistyczna — nie blokuje wiersza; podczas aktualizacji sprawdza, czy wiersz się nie zmienił
Pesymistyczna: SELECT ... FOR UPDATE
Zablokuj teraz, zapisz później:
BEGIN;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;
-- other transactions cannot lock or update this row
-- compute new balance...
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;FOR SHARE
Blokada odczytu — inni mogą odczytywać, ale nie mogą zapisywać:
SELECT * FROM orders WHERE id = 1 FOR SHARE;
-- others can SELECT FOR SHARE but cannot UPDATEZalety i wady podejścia pesymistycznego
Zalety: łatwe rozumowanie, brak konieczności ponawiania prób.
Wady: zmniejsza współbieżność, może powodować oczekiwanie na blokady i zakleszczenia.
Optymistyczna: kolumna wersji
Odczytaj z wersją, zapisz z warunkiem WHERE version = expected:
BEGIN;
SELECT id, balance, version FROM accounts WHERE id = 1;
-- compute new balance...
UPDATE accounts
SET balance = ?, version = version + 1
WHERE id = 1 AND version = ?;
-- check rows affected: 0 means someone else updated, retryOptymistyczne podejście z updated_at
Ta sama idea, z użyciem updated_at zamiast jawnej kolumny wersji:
UPDATE accounts
SET balance = ?, updated_at = NOW()
WHERE id = ? AND updated_at = ?;
-- If updated_at has changed in the meantime, 0 rows affected — retry.Zalety i wady podejścia optymistycznego
Zalety: wysoka współbieżność, brak oczekiwania.
Wady: zapisy mogą się nie powieść i wymagać ponawiania prób; konflikt ujawnia się dopiero podczas UPDATE.
Kiedy wybrać podejście pesymistyczne
W przypadku:
- krótkich transakcji z dużą rywalizacją o gorące wiersze
- przelewów — nie należy dopuścić do częściowego wykonania operacji
- długotrwałych operacji, w których konflikt jest prawdopodobny
Kiedy wybrać podejście optymistyczne
W przypadku:
- obciążeń z przewagą odczytów i rzadkimi konfliktami
- bezstanowych API, w których klient przechowuje wiersz między żądaniami
- edycji mobilnej lub offline, po której następuje synchronizacja
Podejście hybrydowe: FOR UPDATE NOWAIT
Spróbuj zablokować wiersz; jeśli jest zablokowany, natychmiast zakończ działanie i pozwól użytkownikowi ponowić próbę:
SELECT * FROM accounts WHERE id = 1 FOR UPDATE NOWAIT;
-- ERROR if someone else holds it — user sees a friendly retry messageBlokady doradcze
Blokady na poziomie aplikacji, niezwiązane z żadnym wierszem:
SELECT pg_try_advisory_xact_lock(hashtext('order:42'));
-- True if you got the lock, false otherwise — useful for cross-row coordination.Nie zapomnij zindeksować celów blokad
FOR UPDATE bez indeksu na kolumnie użytej w WHERE może zablokować więcej wierszy, niż oczekiwano (blokowane są skanowane wiersze, a nie tylko pasujące).
Limity czasu blokad
Ustaw lock_timeout, aby uniknąć nieskończonego oczekiwania:
SET lock_timeout = '5s';
BEGIN;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
-- ERROR if lock not acquired in 5 secondsPodsumowanie
Podejście pesymistyczne blokuje wiersz, a optymistyczne sprawdza go podczas zapisu.
- Pesymistyczne: FOR UPDATE — proste, ale zmniejsza współbieżność
- Optymistyczne: kolumna wersji — większa współbieżność, ale wymaga ponawiania prób
- Wybieraj podejście zależnie od obciążenia; w razie potrzeby łącz oba
Szybkie sprawdzenie
Zmniejszanie stanu magazynowego produktu w sklepie internetowym jest operacją o dużej rywalizacji. Która strategia blokowania jest zazwyczaj bezpieczniejsza?
Często zadawane pytania
Czy lekcja „Blokowanie optymistyczne a pesymistyczne” jest bezpłatna?
Tak — pełny tekst „Blokowanie optymistyczne a pesymistyczne” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Blokowanie optymistyczne a pesymistyczne”?
Porównywać wzorce SELECT ... FOR UPDATE (pesymistyczny) oraz version-column / WHERE updated_at = ? (optymistyczny) Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Blokowanie optymistyczne a pesymistyczne”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Właściwości ACID i anomalie
- Poziomy izolacji: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
- Zakleszczenia: wykrywanie i unikanie
- Blokowanie optymistyczne a pesymistyczne