Hai chiesto
dove vengono archiviati i dati non impegnati, in modo che una transazione READ_UNCOMMITTED possa leggere i dati non impegnati da un'altra transazione?
Per rispondere alla tua domanda, devi sapere come appare l'architettura InnoDB.
L'immagine seguente è stata creata anni fa dal CTO di Percona Vadim Tkachenko
Secondo la documentazione MySQL sul modello di transazione e sul blocco di InnoDB
Un COMMIT significa che le modifiche apportate alla transazione corrente vengono rese permanenti e diventano visibili ad altre sessioni. Un'istruzione ROLLBACK, invece, annulla tutte le modifiche apportate dalla transazione corrente. Sia COMMIT che ROLLBACK rilasciano tutti i blocchi InnoDB impostati durante la transazione corrente.
Poiché COMMIT e ROLLBACK regolano la visibilità dei dati, READ COMMITTED e READ UNCOMMITTED dovrebbero fare affidamento su strutture e meccanismi che registrano le modifiche
- Segmenti di rollback / Annulla spazio
- Ripeti registri
- Blocchi vuoti contro i tavoli coinvolti
I segmenti di rollback e Annulla spazio saprebbero come apparivano i dati modificati prima dell'applicazione delle modifiche. Ripeti registri saprebbe quali modifiche devono essere portate in avanti per visualizzare i dati aggiornati.
Hai anche chiesto
perché non è possibile per una transazione READ_COMMITTED leggere dati non impegnati, ovvero eseguire una "lettura sporca"? Quale meccanismo applica questa limitazione?
Entrano in gioco i file Ripristina registri, Annulla spazio e Bloccato. Devi anche considerare il pool di buffer InnoDB (dove puoi misurare le pagine sporche con innodb_max_dirty_pages_pct , innodb_buffer_pool_pages_dirty e innodb_buffer_pool_bytes_dirty ).
Alla luce di ciò, READ COMMITTED saprebbe quali dati appaiono permanentemente. Pertanto, non è necessario cercare pagine sporche non impegnate. LEGGI IMPEGNATO non sarebbe altro che una lettura sporca che è stata commessa. LEGGI UNCOMMITTED avrebbe continuato a sapere quali righe devono essere bloccate e quali registri di ripetizione devono essere letti o ignorati per rendere visibili i dati.
Per comprendere appieno il blocco delle righe per la gestione dell'isolamento, leggi Il modello di transazione e il blocco di InnoDB