Vai al contenuto
eLearner.app
Modulo 11 · Lezione 4 di 444/57 nel corso~12 min
Lezioni del modulo (4/4)

Livelli di Isolamento

Oltre al FOR UPDATE esplicito, le transazioni hanno anche delle regole matematiche innate gestite nel profondo dell'engine relative a quanta energia impiegare per isolare di base ogni singola interazione. Questo si definisce Isolation Level. Nel mondo SQL ne conosciamo 4 standard, in ordine di potenza e sicurezza ma ovviamente inversi in fattore performance.

  • READ UNCOMMITTED: Il delirio anarchico, la tua transazione vedrà tutti i dati cambiati dagli altri inclusi i dati temporanei di gente a metà dei propri script. Nessuno lo usa su grossi db, causa gli errori dei Dirty Reads continui.
  • READ COMMITTED: (Default per Postgres). Vedrai istantaneamente il nuovo dato appena una terza parte ha emesso COMMIT, ma puoi finire vittima delle phantom reads (vedi nuovi record a metà dei tuoi percorsi lunghi) o in consistent view non linear.
  • REPEATABLE READ: Più pesante. Per la durata della tua mega-sessione temporale "vedo" il database congelato all'istante dell'inizio della mia query, ignorando totalmente e disconoscendo anche i vari commit ufficiali completati dalle altre persone! Protegge dai record comparsi magicamente garantendo stabilità.
  • SERIALIZABLE: Livello Dio (Lentissimo). Tratta ogni transazione sovrapposta bloccandole ed eseguendole serialmente in fila ad una corsia, abortendo spietatamente quelle in collissione, eliminando a radice anche la possibilità scientifica che accada anche la minima collisione, sacrificando un buon 90% dell'alto smistamento.

Come si setta?

Invece del normale BEGIN; digiti:

SQL
BEGIN ISOLATION LEVEL SERIALIZABLE;

-- e prosegui normale col tuo isolamento ermetico
UPDATE products SET stock = 10;
COMMIT;

Oppure in alcune varianti e engine vecchi lo assegni post inizio:

SQL
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Prova tu

Esercizio#sql.m11.l4.e1
Tentativi: 0Caricamento…

Inizia una transazione impostando formalmente il livello globale per la vita della query su REPEATABLE READ per creare un interscambio congelato e protetto.\nRicorda che a livello di query non ha utilità se non la sussegui da altro, dunque chiudila a vuoto con 'COMMIT'.

Caricamento editor…
Mostra suggerimento

Apri con BEGIN ISOLATION LEVEL REPEATABLE READ; e chiudi con COMMIT;

Soluzione disponibile dopo 3 tentativi

Esercizio#sql.m11.l4.e2
Tentativi: 0Caricamento…

Proviamo il livello folle serializable e inseriamo fittiziamente un dato.\nApri un blocco 'SERIALIZABLE'.\nAggiorna il nome della categoria Id=2 in 'Nuovo Nome Segreto'.\nEsegui il commit atomico finale e riassestante.

Caricamento editor…
Mostra suggerimento

BEGIN ISOLATION LEVEL SERIALIZABLE;\nUPDATE categories SET name = 'Nuovo Nome Segreto' WHERE id = 2;\nCOMMIT;

Soluzione disponibile dopo 3 tentativi