Vorwort Um die Konsistenz und Integrität der Daten zu gewährleisten, verfügt jede Datenbank über einen Sperrmechanismus. Die Vor- und Nachteile des Sperrmechanismus hängen direkt mit der gleichzeitigen Verarbeitungsfähigkeit und Leistung eines Datenbanksystems zusammen. Daher ist die Implementierung des Sperrmechanismus zu einer der Kerntechnologien verschiedener Datenbanken geworden. Vor etwa einigen Monaten wurden im Projekt Transaktionen verwendet und eine starke Datenkonsistenz musste sichergestellt werden. Während dieser Zeit wurden auch MySQL-Sperren verwendet, aber zu diesem Zeitpunkt hatte ich nur einen flüchtigen Blick auf den Sperrmechanismus von MySQL, daher soll dieser Artikel den Sperrmechanismus von MySQL zusammenfassen. In diesem Artikel wird hauptsächlich der MySQL-Sperrmechanismus behandelt. Die MySQL-Version ist 5.7 und die Engine ist InnoDB. Da es in der Praxis viel Wissen und viele Sperrmethoden im Zusammenhang mit InnoDB-Sperren gibt, reicht die Energie nicht aus, um den Sperrprozess in allen Szenarien aufzulisten und zu analysieren. Ich werde nur auf der Grundlage des aktuellen Wissens und in Kombination mit den offiziellen Dokumenten über mein Verständnis sprechen. Wenn Sie etwas Falsches finden, können Sie mich gerne korrigieren. Überblick Im Allgemeinen verfügt InnoDB über sieben Arten von Sperren:
Detaillierte Erklärung der MySQL-Sperre 1. Gemeinsam genutzte und exklusive Sperren
Die verwendete Semantik ist:
Es ist ersichtlich, dass die Daten nicht von anderen Aufgaben gelesen werden können, wenn die Aufgabe des Schreibens der Daten nicht abgeschlossen ist, was große Auswirkungen auf die Parallelität hat. Entsprechend der Datenbank ist es verständlich, dass, wenn die Schreibtransaktion nicht festgeschrieben wird, auch die Auswahl zum Lesen verwandter Daten blockiert wird. Die Auswahl bezieht sich hier auf eine mit einer Sperre versehene Auswahl, und die normale Auswahl kann die Daten weiterhin lesen (Snapshot-Lesen). 2. Absichtssperren InnoDB führte Intention-Locks ein, um Sperren mit mehrfacher Granularität zu unterstützen, wodurch Sperren auf Zeilenebene und Sperren auf Tabellenebene nebeneinander bestehen können. Eine Absichtssperre bedeutet, dass zu einem späteren Zeitpunkt für eine Transaktion möglicherweise eine gemeinsame/exklusive Sperre hinzugefügt werden muss, sodass eine Absicht im Voraus erklärt wird. 1. Die Absichtssperre ist eine Sperre auf Tabellenebene (Sperre auf Tabellenebene). 2. Absichtssperren werden unterteilt in:
Die Syntax zum Sperren lautet: Wählen Sie ... Sperre im Freigabemodus; Um die IS-Sperre einzustellen; Wählen Sie ... zum Aktualisieren; Zum Festlegen der IX-Sperre; Um S/X-Sperren für bestimmte Zeilen zu erhalten, muss eine Transaktion zuerst die IS/IX-Sperren erhalten, die der Tabelle entsprechen. Absichtssperren zeigen nur Absichten an. Absichtssperren sind miteinander kompatibel. Die kompatiblen und sich gegenseitig ausschließenden Tabellen sind wie folgt:
Obwohl Intention Locks miteinander kompatibel sind, schließen sie sich gegenseitig mit Shared Locks/Exklusiv Locks aus. Die Tabelle der Kompatibilitäten und gegenseitigen Ausschlüsse lautet wie folgt:
Exklusive Schlösser sind sehr starke Schlösser und nicht mit anderen Schlosstypen kompatibel. Dies ist eigentlich sehr leicht zu verstehen. Wenn Sie eine Zeile ändern oder löschen, müssen Sie eine starke Sperre erhalten, um andere gleichzeitige Zugriffe auf diese Zeile zu verhindern und die Datenkonsistenz sicherzustellen. 3. Datensatzsperren Datensatzsperre, die beispielsweise den Indexdatensatz blockiert (wobei die ID pk ist): Tabelle erstellen lock_example(id smallint(10),name varchar(20),Primärschlüssel-ID)engine=innodb; Die Datenbankisolationsebene ist RR und die Tabelle enthält die folgenden Daten:
Wählen Sie * aus t, wobei ID=1 für die Aktualisierung ist; Tatsächlich erhalten wir hier zuerst die beabsichtigte exklusive Sperre (IX) der Tabelle und dann die exklusive Sperre dieser Datensatzzeile (nach meinem Verständnis liegt das daran, dass der Index hier direkt getroffen wird), um zu verhindern, dass andere Transaktionen die Zeile mit der ID = 1 einfügen, aktualisieren und löschen. 4. Lückenschlösser Lückensperren, die eine Lücke in einem Indexdatensatz oder den Bereich vor dem ersten Indexdatensatz oder den Bereich nach dem letzten Indexdatensatz blockieren. Immer noch unter Verwendung des obigen Beispiels, InnoDB, RR: Wählen Sie * aus Lock_Example wobei id zwischen 8 und 15 liegt zum Update; Diese SQL-Anweisung blockiert das Intervall (8,15), um zu verhindern, dass andere Transaktionen Datensätze einfügen, deren ID in diesem Intervall liegt. Der Hauptzweck von Lückensperren besteht darin, zu verhindern, dass andere Transaktionen Daten in das Intervall einfügen, was zu „nicht wiederholbaren Lesevorgängen“ führt. Wenn die Transaktionsisolationsebene auf Read Committed (RC) herabgestuft wird, wird die Gap-Sperre automatisch ungültig. 5. Schlösser mit nächstem Schlüssel Eine temporäre Schlüsselsperre ist eine Kombination aus einer Datensatzsperre und einer Lückensperre. Ihr Sperrbereich umfasst sowohl Indexdatensätze als auch Indexintervalle. Standardmäßig verwendet InnoDB Next-Key-Sperren, um Datensätze zu sperren. Wenn der abgefragte Index jedoch ein eindeutiges Attribut enthält, wird Next-Key Lock optimiert und auf Record Lock herabgestuft, was bedeutet, dass nur der Index selbst gesperrt wird, nicht der Bereich. Beispielsweise ist die Tabelle lock_example immer noch dieselbe wie oben, aber id wird auf einen normalen Index (Schlüssel) herabgestuft. Das heißt, selbst wenn hier eine Sperre deklariert wird (für die Aktualisierung) und der Index erreicht wird, verwendet InnoDB Next-Key-Sperren und die Datenbankisolationsebene RR, da der Index hier keine UK-Einschränkung hat: Transaktion A führt die folgende Anweisung aus, wird aber nicht festgeschrieben: Wählen Sie * aus Lock_Example, wobei ID = 20 für Update ist; Transaktion B startet und führt die folgende Anweisung aus, die blockiert: in lock_example-Werte einfügen ('zhang', 15); Im obigen Beispiel wird, nachdem Transaktion A die Abfrageanweisung ausgeführt hat, standardmäßig die Next-Key-Sperre zum Datensatz mit der ID=20 hinzugefügt, sodass Transaktion B beim Einfügen von Datensätzen zwischen 10 (einschließlich) und 30 (exklusiv) blockiert wird. Der Hauptzweck der temporären Tastensperre besteht darin, Phantomzugriffe zu verhindern. Wenn die Transaktionsisolationsebene auf RC herabgestuft wird, wird auch die temporäre Schlüsselsperre ungültig. 6. Absichtssperren einfügen Um vorhandene Datenzeilen zu ändern und zu löschen, muss eine gegenseitige Ausschlusssperre (X-Sperre) verstärkt werden. Ist es also für die Dateneinfügung notwendig, eine so starke Sperre hinzuzufügen, um einen gegenseitigen Ausschluss zu implementieren? Setzen Sie das Absichtsschloss ein und bringen Sie Ihr Kind zur Welt. Die Einfügeabsichtssperre ist eine Art Lückensperre (sie wird also auch auf dem Index implementiert), die speziell für Einfügevorgänge gedacht ist. Wenn mehrere Transaktionen Datensätze in denselben Index und Bereich einfügen, blockieren sie sich nicht gegenseitig, sofern es keine Konflikte zwischen den Einfügepositionen gibt.
Beispielsweise wird zuerst Transaktion A ausgeführt (die Tabelle ist immer noch lock_example und die Daten sind immer noch dieselben wie oben). Dabei wird eine Zeile in die Datensätze 10 und 20 eingefügt, die aber noch nicht festgeschrieben wurde: in t-Werte (11, xxx) einfügen; Transaktion B wird später ausgeführt und fügt auch eine Zeile in die Datensätze 10 und 20 ein: in t-Werte einfügen (12, ooo); Da es sich um einen Einfügevorgang handelt, kommt es trotz der Einfügungen im selben Intervall nicht zu Konflikten zwischen den eingefügten Datensätzen, sodass eine Einfügeabsichtssperre verwendet wird. Hier blockiert Transaktion A Transaktion B nicht. 7. Auto-Inc-Schlösser Die Auto-Inkrement-Sperre ist eine spezielle Sperre auf Tabellenebene, die speziell für Transaktionen verwendet wird, die AUTO_INCREMENT-Spalten einfügen. Im einfachsten Fall, wenn eine Transaktion Datensätze in eine Tabelle einfügt, müssen alle anderen Transaktionen warten, damit die von der ersten Transaktion eingefügten Zeilen aufeinanderfolgende Primärschlüsselwerte haben.
Beispiel: (Die Tabelle ist immer noch lock_example wie oben), aber die ID ist AUTO_INCREMENT und die Daten in der Datenbanktabelle sind:
Transaktion A wird zuerst ausgeführt, aber noch nicht festgeschrieben: insert into t(name) values(xxx); Nach Transaktion B ausführen: in t(Name) Werte(ooo) einfügen; Zu diesem Zeitpunkt wird der Einfügevorgang der Transaktion B blockiert, bis Transaktion A festgeschrieben ist. Zusammenfassen Die oben zusammengefassten 7 Schlosstypen können auf zwei Arten unterschieden werden: 1. Je nach Grad des gegenseitigen Ausschlusses von Sperren können diese in gemeinsam genutzte und exklusive Sperren unterteilt werden.
2. Je nach Granularität des Schlosses kann es unterteilt werden in:
In
Nun, 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. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Das könnte Sie auch interessieren:
|
<<: Das WeChat-Applet verwendet Canvas zum Zeichnen von Uhren
Die Implementierung eines benutzerdefinierten Kar...
Binlog ist eine binäre Protokolldatei, die alle M...
1. Installation und Konfiguration von Apache 2.4....
Inhaltsverzeichnis 1. Was ist die Anti-Shake-Funk...
Im Prozess der Teamentwicklung ist die Formulieru...
In diesem Artikel wird der spezifische Code für J...
MySQL-Downloads für alle Plattformen sind unter M...
Der detaillierte Prozess der Verwendung der MySQL...
1: Installation eines privaten Docker-Warehouses ...
Inhaltsverzeichnis Zyklus für für-in für-von währ...
In diesem Tutorial wird erklärt, wie Sie die IP-A...
Wenn man online nach Methoden sucht, um Angular -...
Es gibt ein Unternehmen, das die 5 zuletzt überpr...
Div-Grundlayout <div Klasse="Haupt"&...
1. Einführung in Docker 1.1 Virtualisierung 1.1.1...