Saltar al contenido principal
eLearner.app
Módulo 11 · Lección 4 de 444/57 en el curso~12 min
Lecciones del módulo (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

Ejercicio#sql.m11.l4.e1
Intentos: 0Cargando...

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'.

Cargando editor...
Mostrar pista

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

Solución disponible después de 3 intentos

Ejercicio#sql.m11.l4.e2
Intentos: 0Cargando...

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.

Cargando editor...
Mostrar pista

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

Solución disponible después de 3 intentos