L'isolamento delle transazioni influisce su come le transazioni simultanee vedono le modifiche reciproche. Questo è una parte importante delle proprietà ACID. In ANSI SQL ci sono quattro livelli di isolamento di base:
La scelta del livello dipende dai requisiti dell'applicazione:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; -- Le successive SELECT vedranno valori "congelati"
"Il livello REPEATABLE READ garantisce protezione dalle letture fantasma in qualsiasi DB?"
No. In PostgreSQL e in alcuni altri DBMS, il livello REPEATABLE READ previene solo letture sporche e non ripetibili, ma non protegge necessariamente dalle letture fantasma. In MySQL/InnoDB, REPEATABLE READ è in sostanza SERIALIZABLE, ma in altri DBMS no.
-- In una transazione leggiamo SELECT * FROM orders WHERE amount > 100; -- In un'altra transazione viene inserito un nuovo valore con amount > 100 e viene confermato -- La prima transazione alla successiva SELECT vedrà una riga "fantasma" se l'isolamento è inferiore a SERIALIZABLE
Storia
Un servizio finanziario ha bloccato solo READ COMMITTED per motivi di prestazioni — l'utente ha visto un importo che era già stato modificato da un altro processo, sono emerse discrepanze nel saldo.
Storia
Nel sistema di prenotazione alberghiera si sono verificate doppie prenotazioni della stessa camera — le transazioni non isolavano l'estrazione delle prenotazioni attuali, il livello era READ COMMITTED.
Storia
Transizione da MySQL a PostgreSQL: lo sviluppatore era abituato a che REPEATABLE READ proteggesse dalle letture fantasma, ma dopo la migrazione sono comparsi ordini "sospesi" che non ci si aspettava di vedere con richieste ripetute nella stessa transazione.