Tu as demandé
où sont stockées les données non validées, de sorte qu'une transaction READ_UNCOMMITTED puisse lire les données non validées d'une autre transaction?
Pour répondre à votre question, vous devez savoir à quoi ressemble l'architecture InnoDB.
L'image suivante a été créée il y a des années par Percona CTO Vadim Tkachenko
Selon la documentation MySQL sur le modèle de transaction et le verrouillage InnoDB
Un COMMIT signifie que les modifications apportées à la transaction en cours deviennent permanentes et deviennent visibles pour les autres sessions. Une instruction ROLLBACK, en revanche, annule toutes les modifications apportées par la transaction en cours. COMMIT et ROLLBACK libèrent tous les verrous InnoDB définis lors de la transaction en cours.
Étant donné que COMMIT et ROLLBACK régissent la visibilité des données, READ COMMITTED et READ UNCOMMITTED devraient s'appuyer sur des structures et des mécanismes qui enregistrent les modifications.
- Segments de restauration / espace d'annulation
- Rétablir les journaux
- Lacunes par rapport aux tables impliquées
Les segments d'annulation et l'espace d'annulation sauraient à quoi ressemblaient les données modifiées avant d'appliquer les modifications. Les fichiers de journalisation sauraient quelles modifications doivent être apportées pour que les données apparaissent mises à jour.
Vous avez également demandé
pourquoi n'est-il pas possible pour une transaction READ_COMMITTED de lire des données non validées, c'est-à-dire d'effectuer une "lecture incorrecte"? Quel mécanisme applique cette restriction?
Les journaux de rétablissement, l'espace d'annulation et les lignes verrouillées entrent en jeu. Vous devez également considérer le pool de tampons InnoDB (où vous pouvez mesurer les pages sales avec innodb_max_dirty_pages_pct , innodb_buffer_pool_pages_dirty et innodb_buffer_pool_bytes_dirty ).
À la lumière de cela, READ COMMITTED saurait à quoi ressemblent les données en permanence. Par conséquent, il n'est pas nécessaire de rechercher des pages sales qui n'ont pas été validées. LIRE ENGAGÉ ne serait rien de plus qu'une sale lecture qui a été commise. READ UNCOMMITTED aurait continué à savoir quelles lignes doivent être verrouillées et quels journaux de rétablissement ont été lus ou ignorés pour rendre les données visibles.
Pour bien comprendre le verrouillage des lignes pour gérer l'isolement, veuillez lire le modèle de transaction et le verrouillage InnoDB