Vorwort Wenn Sie jemand fragt: „Was sind die Merkmale von Datenbanktransaktionen?“ Sie können schnell auf die Fragen Atomizität, Konsistenz, Isolation und Dauerhaftigkeit antworten, die die ACID-Eigenschaften darstellen. Wissen Sie also, wie InnoDB diese Transaktionseigenschaften garantiert? Wenn Sie das wissen, können Sie diesen Artikel einfach überspringen (#^.^#) Lassen Sie mich zunächst das Fazit darlegen:
Redo-Protokoll Das Redo-Log-Redo-Log ist in zwei Teile unterteilt: Der eine ist der Redo-Log-Puffer im Speicher, der leicht verloren gehen kann, der andere ist die Redo-Log-Datei, die dauerhaft ist. InnoDB erreicht Persistenz durch den Force Log at Commit-Mechanismus. Beim Commit müssen alle Transaktionsprotokolle zur Persistenz zunächst in die Redo-Log-Datei geschrieben werden, und die Transaktion gilt erst nach Abschluss des Commit-Vorgangs als abgeschlossen. InnoDB schreibt den Inhalt des Redo-Log-Puffers in den folgenden Situationen in die Redo-Log-Datei:
Um sicherzustellen, dass jedes Protokoll in die Redo-Logdatei geschrieben wird, muss die InnoDB-Speicher-Engine jedes Mal, wenn der Protokollpuffer in die Redo-Logdatei geschrieben wird, einen fsync-Vorgang (Flush) aufrufen. Dies ist jedoch nicht absolut. Benutzer können die Strategie zum Leeren von Redo-Protokollen auf die Festplatte steuern, indem sie den Parameter innodb_flush_log_at_trx_commoit ändern, der beim Festschreiben einer großen Anzahl von Transaktionen als Optimierungspunkt verwendet werden kann.
Rollback-Protokoll Undo-Protokoll Um die Atomizität von Transaktionen sicherzustellen, sichern Sie die Daten vor der Verarbeitung zunächst an einem Ort (der Ort, an dem die Datensicherung gespeichert wird, wird als Undo-Protokoll bezeichnet) und ändern Sie dann die Daten. Wenn ein Fehler auftritt oder der Benutzer eine ROLLBACK-Anweisung ausführt, kann das System die Sicherung im Undo-Protokoll verwenden, um die Daten in den Zustand vor Beginn der Transaktion wiederherzustellen. Das Undo-Protokoll implementiert die Multi-Version Concurrency Control (MVCC), um die Transaktionsisolierung sicherzustellen. Das Rollback-Log unterscheidet sich vom Redo-Log. Es handelt sich um ein logisches Log, das alle Änderungen an der Datenbank logisch rückgängig macht. Wenn eine Transaktion zurückgesetzt wird, geschieht eigentlich das Gegenteil von dem, was sie vorher getan hat. Für jedes INSERT führt die InnoDB-Speicher-Engine ein DELETE aus; für jedes UPDATE führt die InnoDB-Speicher-Engine ein umgekehrtes UPDATE aus. Das Undo-Protokoll kann nicht unmittelbar nach dem Festschreiben einer Transaktion gelöscht werden, da möglicherweise andere Transaktionen das Undo-Protokoll verwenden müssen, um die vorherige Version des Zeilendatensatzes abzurufen. Wenn eine Story-Aufgabe übermittelt wird, wird das Undo-Protokoll in eine verknüpfte Liste eingefügt. Ob das Undo-Protokoll gelöscht werden kann, hängt von den folgenden zwei Situationen ab:
Sperren Das Implementierungsprinzip der Transaktionsisolation ist die Sperre, daher kann die Isolation auch als Parallelitätskontrolle, Sperre usw. bezeichnet werden. Die Transaktionsisolierung erfordert, dass die Objekte jeder Lese-/Schreibtransaktion von den Operationsobjekten anderer Transaktionen getrennt werden. Darüber hinaus müssen beispielsweise beim Bedienen der LRU-Liste im Pufferpool sowie beim Löschen, Hinzufügen und Verschieben von Elementen in der LRU-Liste Sperren eingesetzt werden, um die Konsistenz sicherzustellen. Arten von Schlössern InnoDB verfügt über zwei Haupttypen von Sperren: Zeilensperren und Intention-Sperren Sperren auf Zeilenebene:
Mit Ausnahme von S und S sind alle anderen Sperren auf Zeilenebene inkompatibel. Absichtssperre:
Erklären Sie die Absichtssperre
Der Hauptzweck von Absichtssperren besteht darin, auszudrücken, dass eine Transaktion eine Datenzeile sperrt oder sperren wird. Wenn beispielsweise Transaktion A eine X-Sperre auf eine Zeile des Datensatzes r anwenden möchte, wendet InnoDB zuerst eine IX-Sperre auf die Tabelle an und sperrt dann die X-Sperre auf Datensatz r. Bevor Transaktion A abgeschlossen ist, möchte Transaktion B eine vollständige Tabellenoperation ausführen. Zu diesem Zeitpunkt weist IX auf Tabellenebene Transaktion B direkt an, zu warten, ohne feststellen zu müssen, ob jede Zeile in der Tabelle gesperrt ist. Der Wert absichtlich exklusiver Sperren liegt in der Einsparung von InnoDBs Sperrpositionierung und Verarbeitungsleistung. Beachten Sie auch, dass Absichtssperren nur bei vollständigen Tabellenscans blockieren. Sperralgorithmus InnoDB verfügt über drei Zeilensperralgorithmen:
Hier sprechen wir hauptsächlich über Next-Key Lock. Next-Key Lock sperrt nicht einen einzelnen Wert, sondern einen Bereich. Sein Zweck besteht darin, zu verhindern, dass mehrere Transaktionen Datensätze in denselben Bereich einfügen und dadurch Phantom-Lesevorgänge verursachen. Beachten Sie, dass bei Verwendung eines eindeutigen Index die Next-Key-Sperre auf eine Datensatzsperre herabgestuft wird. Dies bedeutet, dass nur der Index selbst und nicht der Bereich gesperrt wird. Das heißt, die Voraussetzung für Next-Key Lock ist, dass die Transaktionsisolationsstufe RR ist und der abgefragte Index ein nicht eindeutiger Index oder ein Primärschlüsselindex ist. Lassen Sie uns dies anhand eines Beispiels im Detail erklären. Erstellen Sie zunächst eine Tabelle: TABELLE ERSTELLEN (id int, f_id int, PRIMARY KEY (id), KEY(f_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 in T einfügen SELECT 1,1; in T einfügen SELECT 3,1; in T einfügen SELECT 5,3; in T einfügen SELECT 7,6; einfügen in T SELECT 10,8; Transaktion A führt die folgende Anweisung aus: Wählen Sie * aus T, wobei f_id = 3 für Update ist Zu diesem Zeitpunkt verwendet die SQL-Anweisung einen nicht eindeutigen Index. Daher wird Next-Key Locking verwendet und es gibt zwei Indizes, die separat gesperrt werden müssen. Für den gruppierten Index fügt es nur dem Index mit der ID 5 eine Datensatzsperre hinzu. Für den Hilfsindex wird Next-Key Lock hinzugefügt, um den Bereich (1,3) zu sperren. Besonders wichtig ist zu beachten, dass die InnoDB-Speicher-Engine auch dem nächsten Schlüsselwert des Hilfsindexes ein Gap Lock hinzufügt, also eine Sperre im Bereich (3,6). Wenn Sie daher die folgenden Anweisungen in einer neuen Sitzung ausführen, wird ein Fehler select * from T where id = 5 lock in share MODE – kann nicht ausgeführt werden, da Transaktion A eine X-Sperre zum Wert von id = 5 hinzugefügt hat und die Ausführung blockiert wird. INSERT INTO T SELECT 4,2 – kann nicht ausgeführt werden, der Wert des Hilfsindex ist 2, was im Bereich von (1,3) liegt und die Ausführung wird blockiert. INSERT INTO T SELECT 6,5 – kann nicht ausgeführt werden, die Lückensperre sperrt den Bereich von (3,6) und die Ausführung wird blockiert. Stellen Sie sich nun vor, dass Transaktion A den Datensatz mit f_id = 5 sperrt. Normalerweise gibt es eine Lückensperre, die (5, 6) sperrt. Wenn es keine Lückensperre für (5, 6) gibt, kann der Benutzer einen Datensatz mit dem Index f_id 5 einfügen. Dann gibt Transaktion A bei einer erneuten Abfrage einen anderen Datensatz zurück, was zu Phantom-Lesevorgängen führt. Wenn unsere Transaktion A beispielsweise Zusammenfassen Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Das könnte Sie auch interessieren:
|
<<: Ausführliche Erklärung der Iteratoren in ECMAScript
>>: Detaillierte Erläuterung der Konfiguration des Samba-Ordnerfreigabeservers unter CentOS
Während der Nutzung des Computers entsteht im Sys...
Vorwort Dieser Artikel ist ziemlich ausführlich u...
Inhaltsverzeichnis 1. Installieren und importiere...
Wenn ich heute nginx auf dem Cloud-Server install...
Nutzungsumgebung Geben Sie im cmd-Modus mysql --v...
Zusammenfassung: Problemlösungsaufzeichnungen von...
Inhaltsverzeichnis Technologie-Stack Wirkung anal...
Dieser Artikel beschreibt die Mysql-Self-Join-Abf...
Vorwort Jeder sollte mit der Watch-API in vue2 ve...
Das MySQL auf einem Server im Computerraum lief e...
Frage: Kann der Ursprungsserver keine Darstellung...
Problembeschreibung Die MySQL-Startfehlermeldung ...
Inhaltsverzeichnis Die erste Methode: Wenn die My...
Aus der Tomcat-Konfigurationsdatei können wir ers...
Was ist ein Primärschlüssel? Ein Primärschlüssel ...