SQL Academy · leksjon

Optimistisk kontra pessimistisk låsing

Sammenlign mønstrene SELECT ... FOR UPDATE (pessimistisk) og versjonskolonne / WHERE updated_at = ? (optimistisk).

Leksjon 4 av 415 trinn

Optimistisk kontra pessimistisk låsing er en gratis leksjon i SQL Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i SQL Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i SQL Academy inneholder totalt 4 leksjoner.

To strategier for samtidighet

  • Pessimistisk — lås raden når du leser den; ingen andre kan endre den
  • Optimistisk — ikke lås; kontroller ved oppdatering at raden ikke er endret

Pessimistisk: SELECT ... FOR UPDATE

Lås nå, skriv senere:

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

Leselås — andre kan lese, men ikke skrive:

SELECT * FROM orders WHERE id = 1 FOR SHARE;
-- others can SELECT FOR SHARE but cannot UPDATE

Fordeler og ulemper ved pessimistisk låsing

Fordeler: enkelt å forstå, ingen nye forsøk er nødvendige.
Ulemper: reduserer samtidigheten og kan føre til låseventing og deadlocks.

Optimistisk: versjonskolonne

Les med versjon, skriv med 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

Optimistisk med updated_at

Samme idé, men med updated_at i stedet for en eksplisitt versjonskolonne:

UPDATE accounts
   SET balance = ?, updated_at = NOW()
WHERE id = ? AND updated_at = ?;

-- If updated_at has changed in the meantime, 0 rows affected — retry.

Fordeler og ulemper ved optimistisk låsing

Fordeler: høy samtidighet, ingen venting.
Ulemper: skriving kan mislykkes og kreve logikk for nye forsøk; konflikten oppdages først ved UPDATE.

Når bør du velge pessimistisk låsing?

For:

  • Korte transaksjoner med høy konkurranse om belastede rader
  • Pengeoverføringer — du vil ikke ha delvis utført arbeid
  • Langvarige operasjoner der konflikt er sannsynlig

Når bør du velge optimistisk låsing?

For:

  • Arbeidsbelastninger med hovedsakelig lesing og sjeldne konflikter
  • Tilstandsløse API-er der klienten holder raden mellom forespørsler
  • Redigering på mobil eller frakoblet, etterfulgt av synkronisering

Hybrid: FOR UPDATE NOWAIT

Prøv å låse; hvis raden er låst, mislykkes operasjonen umiddelbart, slik at brukeren kan prøve på nytt:

SELECT * FROM accounts WHERE id = 1 FOR UPDATE NOWAIT;
-- ERROR if someone else holds it — user sees a friendly retry message

Advisory locks

Låser på applikasjonsnivå som ikke er knyttet til noen rad:

SELECT pg_try_advisory_xact_lock(hashtext('order:42'));
-- True if you got the lock, false otherwise — useful for cross-row coordination.

Ikke glem å indeksere låsemål

FOR UPDATE uten en indeks på WHERE-kolonnen kan låse flere rader enn forventet (låser skannede rader, ikke bare rader som samsvarer).

Tidsavbrudd for låser

Angi lock_timeout for å unngå å vente for alltid:

SET lock_timeout = '5s';
BEGIN;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
-- ERROR if lock not acquired in 5 seconds

Oppsummering

Pessimistisk låsing låser raden; optimistisk låsing kontrollerer ved skriving.

  • Pessimistisk: FOR UPDATE — enkelt, men reduserer samtidigheten
  • Optimistisk: versjonskolonne — gir mer samtidighet, men krever nye forsøk
  • Velg ut fra arbeidsbelastningen; kombiner ved behov

Hurtigsjekk

En lagerreduksjon i en nettbutikk er utsatt for høy konkurranse. Hvilken låsestrategi er vanligvis tryggest?

Gratis å komme i gang

Lær deg SQL med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
46
Leksjoner
183

Ofte stilte spørsmål

Er leksjonen «Optimistisk kontra pessimistisk låsing» gratis?

Ja – hele teksten i «Optimistisk kontra pessimistisk låsing» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av SQL Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i SQL Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Optimistisk kontra pessimistisk låsing»?

Sammenlign mønstrene SELECT ... FOR UPDATE (pessimistisk) og versjonskolonne / WHERE updated_at = ? (optimistisk). Du øver på SQL Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med SQL Academy?

Ingen tidligere erfaring er nødvendig. SQL Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Optimistisk kontra pessimistisk låsing»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne SQL Academy-leksjonen?

Ja. Alle SQL Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. ACID-egenskaper og anomalier
  2. Isolasjonsnivåer: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
  3. Deadlocks: Oppdaging og forebygging
  4. Optimistisk kontra pessimistisk låsing
← Tilbake til SQL Academy