Optimistisk kontra pessimistisk låsing
Sammenlign mønstrene SELECT ... FOR UPDATE (pessimistisk) og versjonskolonne / WHERE updated_at = ? (optimistisk).
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 UPDATEFordeler 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, retryOptimistisk 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 messageAdvisory 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 secondsOppsummering
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?
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
- ACID-egenskaper og anomalier
- Isolasjonsnivåer: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
- Deadlocks: Oppdaging og forebygging
- Optimistisk kontra pessimistisk låsing