Ciao, e benvenuto nell'ottava puntata della settantaseiesima stagione. La volta scorsa la transazione prometteva: ognuno si sente solo. Oggi vediamo come il database mantiene quella promessa quando ne girano tante insieme, e le manopole pratiche che davvero puoi girare tu. Il titolo: leggere senza bloccare.
Il problema è la folla. La biblioteca è piena. Due persone vogliono lo stesso libro; due redattori vogliono cambiare lo stesso record; qualcuno legge uno scaffale mentre un altro è a metà di un riordino. Se non fai niente, è il caos: letture di dati aggiornati a metà, modifiche che si cancellano a vicenda, contraddizioni. Ognuno si sente solo va fabbricato contro una folla vera.
La soluzione brutale sono i fermi. Il modo più semplice di evitare le collisioni è una regola: prima di toccare un libro, metti un fermo; nessun altro può toccarlo finché non hai finito. Chi scrive esclude chi scrive, e va bene. Ma il fermo ingenuo fa anche aspettare i lettori a chi scrive, e chi scrive ai lettori. È corretto, ma è un ingorgo: i lettori bloccano chi scrive, chi scrive blocca i lettori, e tutti in coda. Per un mondo pieno di letture è un disastro: quasi tutti vogliono solo leggere, e restano impalati dietro un unico che scrive.
L'idea migliore sono le versioni, ed è il cuore di oggi. Quando cambi un libro, non cancellare quello vecchio: scrivi una versione nuova accanto alla vecchia, con il timbro di quando è diventata quella valida. Adesso un lettore non ha più bisogno di nessun fermo: legge la versione che era valida quando si è seduto, anche mentre qualcuno ne sta preparando una più recente. I lettori non aspettano mai chi scrive; chi scrive non aspetta mai i lettori. Ogni transazione vede una fotografia coerente, uno scatto di tutta la biblioteca al suo inizio, congelato per tutta la sua vita. Ecco come ognuno si sente solo diventa economico: non chiudendo fuori la folla, ma dando a ciascuno la sua fotografia coerente. È anche il motivo per cui, nella puntata sul registro, non sovrascrivere tornava utile.
Le versioni hanno un costo, diciamolo. Le vecchie edizioni si accumulano, e restano finché una pulizia non decide che nessun lettore ancora in giro ne ha più bisogno e le spazza via. Quella pulizia è la stessa spazzatura che forse hai incontrato nella pratica: di nuovo un debito, come le fusioni di qualche puntata fa. E le fotografie sollevano una domanda sottile: se due transazioni leggono, decidono e scrivono ciascuna sulla propria fotografia, potrebbero prendere decisioni che non possono essere entrambe vere, e il database deve accorgersene e fermarne una. L'isolamento non è mai del tutto gratis: si paga in pulizia, o in conflitti.
E arriviamo alle manopole vere, quelle che scegli nel codice: i livelli di isolamento. L'isolamento perfetto, come se le transazioni corressero una alla volta, in fila, è il più forte e il più caro. Allora i database offrono livelli più deboli, manopole che puoi girare. Al livello più lasco, potresti vedere comparire a metà transazione le modifiche confermate da altri, così due letture della stessa riga danno risposte diverse: economico, e spesso va benissimo. Più stretto, ottieni una fotografia stabile, le tue letture non ti cambiano sotto il naso: è il default comodo di molti sistemi. Al più stretto, la piena serietà, il database ti garantisce un risultato come se la folla non esistesse affatto, e lo paga annullando le transazioni che romperebbero l'illusione, chiedendoti di riprovare.
L'arte pratica è questa: sappi qual è il default del tuo database, perché cambia da uno all'altro; sappi quali stranezze quel default lascia passare; e stringi la manopola solo sulle transazioni che davvero non le tollerano. Non portare tutto al massimo per paura: pagheresti in conflitti e in attese una sicurezza che non ti serviva. Ma non ignorare neppure la manopola: il default è una scelta che ha fatto qualcun altro, e potrebbe non essere la tua.
Un'ultima cosa pratica. Ai livelli forti, il database che annulla la tua transazione e ti dice riprova è normale, non è un difetto. La sicurezza sotto la folla, in alto, spesso significa che il tuo codice deve essere pronto a ritentare. Progettalo apposta.
Voglio lasciarti con la manopola che quasi nessuno guarda. Ogni transazione che scrivi corre dentro un livello di isolamento, e quasi sempre è quello di default, scelto da qualcun altro. Sapere qual è, e cosa lascia passare, è una delle poche conoscenze di database che ti ripagano ogni settimana: spiega i bug strani che spariscono da soli, le letture che non tornano, i rari errori sotto carico. La regola pratica: leggi senza bloccare quando puoi, grazie alle versioni; stringi solo dove la correttezza lo esige; e, in alto, aspettati di dover riprovare. Non è teoria accademica: è la differenza tra un sistema che regge la folla e uno che si inchioda appena la folla arriva.
Per oggi ci fermiamo qui. Abbiamo visto come si fabbrica ognuno si sente solo dentro una folla: i fermi, corretti ma un ingorgo; le versioni, che fanno leggere senza bloccare dando a ciascuno la sua fotografia; il loro costo in pulizia e in conflitti; e le manopole dei livelli di isolamento, con la regola di stringerle solo dove serve e di farsi trovare pronti a riprovare. Nella prossima puntata: la strada giusta. Nelle note trovi qualche spunto. Se ti è utile, condividila. Grazie per l'ascolto, e ci sentiamo alla prossima.