Quali livelli di isolamento delle transazioni nei database conosci?
sobes.tech AI
Risposta dell'AI
Lo standard SQL definisce quattro livelli di isolamento delle transazioni: Read Uncommitted, Read Committed, Repeatable Read, Serializable.
-
Read Uncommitted: Il livello più basso. Una transazione può leggere dati che non sono ancora stati confermati (cioè, eseguiti da un'altra transazione che non ha ancora completato con
COMMIT). Questo porta a "letture sporche" (dirty reads). -
Read Committed: La transazione vede solo i dati che sono stati confermati prima o durante la sua esecuzione. Previene le "letture sporche", ma permette letture non ripetibili (non-repeatable reads) e fantasmi (phantom reads).
- Letture non ripetibili: La stessa lettura all'interno di una transazione può restituire dati diversi perché un'altra transazione li ha modificati e confermati nel frattempo.
- Fantasmi: Quando si esegue una query con condizione
WHERE, un'altra transazione aggiunge o rimuove righe che soddisfano la condizione, e la stessa query eseguita di nuovo nella stessa transazione restituisce un insieme diverso di righe.
-
Repeatable Read: La transazione vede solo i dati che sono stati confermati prima del suo inizio. Garantisce che le stesse letture delle stesse righe in una transazione restituiscano gli stessi dati. Previene le "letture sporche" e non ripetibili. Permette fantasmi.
// Esempio di Repeatable Read // Transazione 1 // BEGIN TRANSACTION; // SELECT COUNT(*) FROM users WHERE status = 'active'; // Per esempio, 100 // Transazione 2 (eseguita contemporaneamente) // BEGIN TRANSACTION; // INSERT INTO users (name, status) VALUES ('Nuovo utente', 'active'); // COMMIT; // Transazione 1 // SELECT COUNT(*) FROM users WHERE status = 'active'; // Ancora 100 (fantasma) // COMMIT; -
Serializable: Il livello più alto di isolamento. Garantisce che l'esecuzione parallela delle transazioni sia equivalente a una loro esecuzione sequenziale. Previene le "letture sporche", non ripetibili e fantasmi. Può ridurre le prestazioni a causa dei blocchi.
In diversi DBMS, possono esserci implementazioni proprie e caratteristiche dei livelli di isolamento, così come livelli aggiuntivi. Ad esempio, in MySQL InnoDB, il livello di default è Repeatable Read.