0Pricing
SQL Academy · Lezione

Locking ottimistico e pessimistico

Confronti SELECT ... FOR UPDATE (pessimistico) e gli schemi con colonna di versione / WHERE updated_at = ? (ottimistico).

Locking ottimistico e pessimistico è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.

Due strategie di concorrenza

  • Pessimistica — bloccare la riga quando la si legge; nessun altro può modificarla
  • Ottimistica — non bloccare la riga; al momento dell'aggiornamento, verificare che non sia cambiata

Pessimistica: SELECT ... FOR UPDATE

Bloccare ora, scrivere in seguito:

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

Lock di lettura: gli altri possono leggere, ma non scrivere:

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

Vantaggi e svantaggi della strategia pessimistica

Vantaggi: semplice da comprendere, non richiede retry.
Svantaggi: riduce la concorrenza e può causare attese sui lock e deadlock.

Ottimistica: colonna della versione

Leggere con la versione e scrivere con 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

Ottimistica con updated_at

Stessa idea, utilizzando updated_at invece di una colonna esplicita per la versione:

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

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

Vantaggi e svantaggi della strategia ottimistica

Vantaggi: elevata concorrenza, nessuna attesa.
Svantaggi: le scritture possono fallire e richiedere una logica di retry; il conflitto emerge solo al momento di UPDATE.

Quando scegliere la strategia pessimistica

Per:

  • Transazioni brevi con elevata contesa su righe molto utilizzate
  • Trasferimenti di denaro: non si desiderano operazioni parziali
  • Operazioni di lunga durata in cui è probabile un conflitto

Quando scegliere la strategia ottimistica

Per:

  • Carichi di lavoro prevalentemente in lettura, con conflitti rari
  • API stateless in cui il client conserva la riga tra una richiesta e l'altra
  • Modifiche da mobile o offline seguite dalla sincronizzazione

Ibrida: FOR UPDATE NOWAIT

Provare ad acquisire il lock; se la riga è bloccata, fallire immediatamente e consentire all'utente di riprovare:

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

Lock consultivi

Lock a livello di applicazione non associati ad alcuna riga:

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

Non dimenticare di indicizzare gli obiettivi dei lock

FOR UPDATE senza un indice sulla colonna usata in WHERE può bloccare più righe del previsto (blocca le righe scansionate, non solo quelle corrispondenti).

Timeout dei lock

Impostare lock_timeout per evitare di attendere indefinitamente:

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

Riepilogo

La strategia pessimistica blocca la riga; quella ottimistica verifica al momento della scrittura.

  • Pessimistica: FOR UPDATE — semplice, ma riduce la concorrenza
  • Ottimistica: colonna della versione — maggiore concorrenza, ma richiede retry
  • Scegliere in base al carico di lavoro; combinarle quando necessario

Verifica rapida

Il decremento delle scorte in un e-commerce è soggetto a forte contesa. Quale strategia di lock è generalmente più sicura?

Domande Frequenti

La lezione «Locking ottimistico e pessimistico» è gratuita?

Sì — il testo completo di «Locking ottimistico e pessimistico» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.

Cosa imparerò in «Locking ottimistico e pessimistico»?

Confronti SELECT ... FOR UPDATE (pessimistico) e gli schemi con colonna di versione / WHERE updated_at = ? (ottimistico). Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare SQL Academy?

Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Locking ottimistico e pessimistico»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione SQL Academy?

Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Proprietà ACID e anomalie
  2. Livelli di isolamento: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
  3. Deadlock: rilevamento e prevenzione
  4. Locking ottimistico e pessimistico
← Torna a SQL Academy