Livelli di isolamento: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
Confronti i livelli di isolamento dello standard SQL, l’implementazione di PostgreSQL e scelga il livello adatto al proprio carico di lavoro.
Livelli di isolamento: READ COMMITTED, REPEATABLE READ, SERIALIZABLE è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 2 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.
I quattro livelli standard
Lo standard SQL definisce quattro livelli di isolamento:
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
PostgreSQL ne implementa tre (READ UNCOMMITTED si comporta come READ COMMITTED).
READ COMMITTED (predefinito in PostgreSQL)
Ogni istruzione vede i dati confermati prima dell'inizio dell'istruzione. All'interno di una singola transazione si possono vedere snapshot diversi.
-- Inside one transaction:
SELECT balance FROM accounts WHERE id = 1; -- 100
-- meanwhile another tx commits balance=200
SELECT balance FROM accounts WHERE id = 1; -- 200 (non-repeatable read)REPEATABLE READ (isolamento tramite snapshot)
Vede uno snapshot acquisito all'inizio della transazione. La rilettura della stessa riga restituisce sempre lo stesso valore. Il livello REPEATABLE READ di PostgreSQL impedisce anche le letture fantasma.
BEGIN ISOLATION LEVEL REPEATABLE READ;
SELECT balance FROM accounts WHERE id = 1; -- 100
-- another tx commits balance=200
SELECT balance FROM accounts WHERE id = 1; -- still 100
COMMIT;SERIALIZABLE
Il livello più forte: è come se le transazioni venissero eseguite una dopo l'altra. PostgreSQL usa Serializable Snapshot Isolation (SSI): rileva le dipendenze concorrenti e interrompe le transazioni in conflitto:
BEGIN ISOLATION LEVEL SERIALIZABLE;
...
COMMIT;
-- ERROR: could not serialize access due to read/write dependenciesImpostazione del livello di isolamento
Per transazione, per sessione o globalmente:
-- Per transaction:
BEGIN ISOLATION LEVEL SERIALIZABLE;
-- Per session:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- Default for new transactions in this session:
SET default_transaction_isolation = 'repeatable read';
-- Global default in postgresql.conf:
-- default_transaction_isolation = 'read committed'Anomalie consentite da ciascun livello
| Livello | Sporca | Non ripetibile | Fantasma |
|---|---|---|---|
| READ UNCOMMITTED | forse | forse | forse |
| READ COMMITTED | no | forse | forse |
| REPEATABLE READ | no | no | no (in PG) |
| SERIALIZABLE | no | no | no |
Compromessi sulle prestazioni
- READ COMMITTED — overhead minimo, predefinito
- REPEATABLE READ — stesso piano, coerenza dello snapshot, nessun impatto sulle prestazioni salvo conflitti di scrittura
- SERIALIZABLE — gestione aggiuntiva, può interrompere le transazioni; nell'app è necessaria una logica di retry
Pattern di retry per SERIALIZABLE
SERIALIZABLE può interrompere la transazione con il codice 40001. Eseguire nuovamente l'operazione in un ciclo:
for (let i = 0; i < 3; i++) {
try {
await client.query('BEGIN ISOLATION LEVEL SERIALIZABLE');
// ... work ...
await client.query('COMMIT');
break;
} catch (e) {
if (e.code === '40001') continue;
throw e;
}
}Lettura di uno snapshot coerente
Per query analitiche di lunga durata che richiedono dati coerenti, REPEATABLE READ rappresenta il giusto compromesso.
Comportamento dei conflitti di scrittura
Se due transazioni modificano la stessa riga:
- READ COMMITTED — la seconda attende, poi rilegge la nuova riga e riprova
- REPEATABLE READ — la seconda viene interrotta con "could not serialize"; l'app deve riprovare
Scegliere il livello corretto
Regole pratiche:
- OLTP — READ COMMITTED (predefinito)
- Report che richiedono coerenza — REPEATABLE READ
- Denaro / inventario — SERIALIZABLE + retry, OPPURE lock espliciti (FOR UPDATE)
A volte i lock espliciti sono migliori dell'isolamento
Spesso SELECT ... FOR UPDATE con READ COMMITTED è più semplice di SERIALIZABLE per una singola riga molto contesa.
Riepilogo
I livelli di isolamento bilanciano sicurezza e concorrenza.
- READ COMMITTED è il livello predefinito
- REPEATABLE READ per letture coerenti
- SERIALIZABLE per un'esecuzione "come se fosse seriale": richiede una logica di retry
Verifica rapida
Qual è il livello di isolamento predefinito di PostgreSQL?
Domande Frequenti
La lezione «Livelli di isolamento: READ COMMITTED, REPEATABLE READ, SERIALIZABLE» è gratuita?
Sì — il testo completo di «Livelli di isolamento: READ COMMITTED, REPEATABLE READ, SERIALIZABLE» è 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 «Livelli di isolamento: READ COMMITTED, REPEATABLE READ, SERIALIZABLE»?
Confronti i livelli di isolamento dello standard SQL, l’implementazione di PostgreSQL e scelga il livello adatto al proprio carico di lavoro. 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 2 di 4.
Quanto tempo richiede la lezione «Livelli di isolamento: READ COMMITTED, REPEATABLE READ, SERIALIZABLE»?
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
- Proprietà ACID e anomalie
- Livelli di isolamento: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
- Deadlock: rilevamento e prevenzione
- Locking ottimistico e pessimistico