0Pricing
SQL Academy · Lekcja

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 UPDATE

Zalety 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, retry

Optymistyczne 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 message

Blokady 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 seconds

Podsumowanie

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

  1. Właściwości ACID i anomalie
  2. Poziomy izolacji: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
  3. Zakleszczenia: wykrywanie i unikanie
  4. Blokowanie optymistyczne a pesymistyczne
← Powrót do SQL Academy