Du hast gefragt
Wo werden nicht festgeschriebene Daten gespeichert, sodass eine READ_UNCOMMITTED-Transaktion nicht festgeschriebene Daten aus einer anderen Transaktion lesen kann?
Um Ihre Frage zu beantworten, müssen Sie wissen, wie die InnoDB-Architektur aussieht.
Das folgende Bild wurde vor Jahren von Percona CTO Vadim Tkachenko erstellt
Laut MySQL-Dokumentation am InnoDB-Transaktionsmodell und zum Sperren
Ein COMMIT bedeutet, dass die in der aktuellen Transaktion vorgenommenen Änderungen dauerhaft sind und für andere Sitzungen sichtbar werden. Eine ROLLBACK-Anweisung bricht dagegen alle durch die aktuelle Transaktion vorgenommenen Änderungen ab. Sowohl COMMIT als auch ROLLBACK geben alle InnoDB-Sperren frei, die während der aktuellen Transaktion festgelegt wurden.
Da COMMIT und ROLLBACK die Sichtbarkeit von Daten regeln, müssten READ COMMITTED und READ UNCOMMITTED auf Strukturen und Mechanismen angewiesen sein, die Änderungen aufzeichnen
- Rollback-Segmente / Leerzeichen rückgängig machen
- Protokolle wiederholen
- Lückensperren für die beteiligten Tabellen
Rollback-Segmente und Undo Space würden wissen, wie geänderte Daten aussehen, bevor Änderungen angewendet werden. Redo Logs würde wissen, welche Änderungen vorwärts gerollt werden müssen, damit die Daten aktualisiert werden.
Du hast auch gefragt
Warum kann eine READ_COMMITTED-Transaktion nicht festgeschriebene Daten lesen, dh einen "Dirty Read" durchführen? Welcher Mechanismus erzwingt diese Einschränkung?
Protokolle wiederholen, Leerzeichen rückgängig machen und gesperrte Zeilen kommen ins Spiel. Sie müssen auch den InnoDB- Pufferpool berücksichtigen (wo Sie schmutzige Seiten mit innodb_max_dirty_pages_pct , innodb_buffer_pool_pages_dirty und innodb_buffer_pool_bytes_dirty messen können ).
Vor diesem Hintergrund würde READ COMMITTED wissen, wie Daten dauerhaft aussehen. Daher müssen Sie nicht nach schmutzigen Seiten suchen, die nicht festgeschrieben wurden. READ COMMITED wäre nichts anderes als ein Dirty Read, der festgeschrieben wurde. READ UNCOMMITTED hätte weiterhin wissen müssen, welche Zeilen gesperrt werden sollen und welche Redo-Protokolle gelesen oder ignoriert wurden, um die Daten sichtbar zu machen.
Lesen Sie das InnoDB-Transaktionsmodell und das Sperren , um das Sperren von Zeilen zum Verwalten der Isolation vollständig zu verstehen