Sobes.tech
Middle

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.

  1. 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).

  2. 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.
  3. 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;
    
  4. 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.