Ciao, e benvenuto nella quarta puntata della cinquantaquattresima stagione. Abbiamo nominato più volte una parola magica, transazioni, promettendo di tornarci. Oggi manteniamo la promessa, e guardiamo come MySQL fa il tutto o niente, e come gestisce tante persone che scrivono insieme. Oggi capiamo le transazioni e i blocchi.
Ripartiamo dall'idea, per chi non c'era, perché è il fondamento. Una transazione è un gruppo di operazioni che devono succedere tutte insieme, o non succedere affatto. L'esempio di sempre è il bonifico: togliere denaro da un conto e aggiungerlo a un altro. O partono entrambi i movimenti, o nessuno. Non deve mai capitare che il denaro sparisca da una parte e non arrivi dall'altra. La transazione è la garanzia di questa completezza: un'operazione intera, mai a metà. Ne parlammo a fondo per Postgres; qui vediamo la strada, diversa, con cui MySQL è arrivato alla stessa meta.
Voglio ricordarti il legame con i motori, perché è la particolarità di MySQL. Ecco la cosa curiosa, e tipica solo di MySQL: se hai le transazioni, dipende dal motore che usi. Con il motore moderno, quello sicuro e predefinito, le hai, piene e affidabili. Con il vecchio motore veloce, non le hai affatto. In quasi tutti gli altri database le transazioni ci sono e basta, sono parte dell'essenza. In MySQL sono una proprietà del corpo che hai scelto. È il prezzo della modularità: una libertà in più, ma anche una cosa in più che devi sapere, per non credere di avere una rete che in realtà non c'è.
Voglio passare al secondo tema, i blocchi, perché è dove si vede la maturità. Quando tante persone scrivono gli stessi dati insieme, la base di dati deve evitare che si facciano del male a vicenda. Lo fa con i blocchi: mentre uno modifica qualcosa, quella cosa è temporaneamente protetta. Ma quanto grande deve essere la cosa protetta? Qui sta la differenza cruciale tra i due motori di MySQL. Il vecchio bloccava tutta la tabella: mentre uno scriveva una singola riga, l'intera tabella era congelata per tutti gli altri. Il motore moderno blocca solo la riga toccata: tutte le altre restano libere.
Voglio farti sentire quanto conta questa differenza, perché è la vita di un sito. Immagina un negozio online con un'unica grande tabella degli ordini, e mille clienti che comprano nello stesso minuto. Col blocco dell'intera tabella, ogni acquisto congela tutti gli altri: si forma una fila lunghissima, e il sito rallenta fino a fermarsi proprio nei momenti di maggior successo. Col blocco della singola riga, i mille acquisti toccano mille righe diverse, e possono avvenire quasi tutti insieme, senza aspettarsi. È la differenza tra un sito che crolla sotto il successo e uno che lo regge. Non a caso il motore moderno ha vinto.
Voglio darti l'immagine che rende chiara questa idea, perché è quotidiana. Pensa a una grande biblioteca. Il blocco dell'intera tabella è come chiudere a chiave tutta la biblioteca ogni volta che una persona prende in prestito un libro: tutti gli altri aspettano fuori, per un solo libro. Il blocco della singola riga è come chiudere a chiave soltanto quel singolo libro, mentre tutti gli altri restano liberi sugli scaffali: mille persone possono prendere mille libri diversi nello stesso istante. La seconda biblioteca serve infinitamente più lettori, con la stessa sala.
Voglio dirti come MySQL evita anche le file di lettura, perché completa il quadro. C'è di più. Il motore moderno, per le letture, usa un'idea che abbiamo già incontrato con Postgres: tiene più versioni dei dati, così chi legge vede una fotografia coerente senza dover aspettare chi scrive, e chi scrive non deve aspettare chi legge. È notevole: due database rivali, partiti da filosofie opposte, sono arrivati, ciascuno per la sua strada, alla stessa soluzione elegante per far convivere lettori e scrittori. Quando un'idea è davvero buona, i progetti indipendenti tendono a scoprirla tutti, prima o poi.
Voglio trarre la lezione generale, perché è pratica. La lezione è duplice. Primo: in MySQL, controlla sempre quale motore stai usando, perché da lì dipende se le tue transazioni sono reali o un'illusione silenziosa. Secondo: la finezza dei blocchi, bloccare poco invece che tanto, è ciò che permette a una base di dati di reggere la folla senza trasformarsi in una fila. Dietro un sito che regge migliaia di utenti insieme c'è quasi sempre questa scelta invisibile: proteggere il minimo necessario, e lasciare libero tutto il resto.
Per oggi ci fermiamo qui. Abbiamo visto transazioni e blocchi. La transazione è il tutto o niente, l'operazione intera come il bonifico; ma in MySQL, cosa curiosa, averle o no dipende dal motore scelto, ed è il prezzo della modularità. Sui blocchi, la differenza è enorme: il vecchio motore congelava l'intera tabella a ogni scrittura, il moderno blocca solo la riga toccata, come chiudere a chiave un singolo libro invece dell'intera biblioteca. È ciò che fa reggere un negozio con mille acquisti insieme. E per le letture, come Postgres, tiene più versioni dei dati. La lezione: controlla il motore, e proteggi solo il minimo necessario. Nella prossima puntata: il registro dei cambiamenti e la replica. Nelle note trovi qualche spunto. Se ti è utile, condividila. Grazie per l'ascolto, e ci sentiamo alla prossima.