1. Einleitung MySQL-Sperren können je nach Umfang in globale Sperren, Tabellensperren und Zeilensperren unterteilt werden. Zeilensperren werden von der Datenbank-Engine implementiert. Nicht alle Engines bieten Zeilensperren. MyISAM unterstützt keine Zeilensperren, daher wird in diesem Artikel die InnoDB-Engine als Beispiel zur Einführung in Zeilensperren verwendet. 2. Globale Sperre MySQL bietet eine globale Sperre, um die gesamte Datenbankinstanz zu sperren. Grammatik: FLUSH-TABELLEN MIT LESE-SPERRE Diese Anweisung wird im Allgemeinen zur Sicherung verwendet. Wenn diese Anweisung ausgeführt wird, werden alle offenen Tabellen in der Datenbank geschlossen und alle Tabellen in der Datenbank mit einer globalen Lesesperre gesperrt. Gleichzeitig werden Aktualisierungsanweisungen (Hinzufügungen, Löschungen und Änderungen) anderer Threads, Datendefinitionsanweisungen (Erstellen von Tabellen, Ändern von Tabellenstrukturen) und Aktualisierungstransaktionsübermittlungen blockiert. Nach MySQL 8.0 kann MySQL die Sicherungssperre direkt für die Sicherung verwenden. Stellungnahme: INSTANZEN FÜR BACKUP sperrenINSTANZEN sperren Diese Sperre hat einen größeren Umfang. Sie verhindert das Erstellen, Umbenennen und Löschen von Dateien, einschließlich 3. Tischsperre Die Sperren auf Tabellenebene von MySQL sind in zwei Kategorien unterteilt: eine ist die Metadatensperre (MDL) und die andere ist die Tabellensperre. Metadatensperren (MDL) müssen nicht explizit verwendet werden und werden automatisch beim Zugriff auf eine Tabelle erworben. Zur Unterstützung dieser Funktion ist MySQL Version 5.5 oder höher erforderlich. Beim Hinzufügen, Löschen, Ändern oder Überprüfen einer Tabelle wird der Tabelle eine MDL-Lesesperre hinzugefügt; wenn die Tabellenstruktur geändert wird, wird eine MDL-Schreibsperre hinzugefügt. Für MDL-Sperren gelten einige Regeln: Lesesperren schließen sich nicht gegenseitig aus, sodass mehrere Threads dieselbe Tabelle ergänzen, löschen, ändern und abfragen können. Lese-/Schreibsperren und Schreibsperren schließen sich gegenseitig aus. Um die Sicherheit von Änderungen in der Tabellenstruktur zu gewährleisten, werden die Operationen in der Tabellenstruktur, wie z. B. das Hinzufügen von Feldern zur gleichen Tabelle, serialisiert und erfordern ein Warten auf die Sperre, wenn mehrere Threads sie ausführen müssen. Die Schreibsperrenpriorität von MDL ist höher als die Lesesperrenpriorität von MDL, aber Sie können die Systemvariable max_write_lock_count festlegen, um diese Situation zu ändern. Wenn die Schreibsperrenanforderung die von dieser Variablen festgelegte Zahl überschreitet, ist die MDL-Lesesperrenpriorität höher als die MDL-Schreibsperrenpriorität. (Standardmäßig ist diese Zahl hoch, Sie müssen sich also keine Sorgen über eine Verringerung der Schreibsperrenpriorität machen.) Die MDL-Sperre darf erst nach Abschluss der Transaktion freigegeben werden. Daher müssen wir beim Bedienen der Datenbanktabellenstruktur darauf achten, keine langen Transaktionen zu verwenden. Was bedeutet das konkret? Lassen Sie mich Ihnen ein Beispiel geben: Die obige Abbildung zeigt die Ausführung von Anweisungen durch vier Sitzungen. Zuerst startet Sitzung A eine Transaktion, führt sie aber nicht aus. Dann führt Sitzung B eine Abfrage aus. Da sie die MDL-Lesesperre erhalten, beeinflussen sie sich nicht gegenseitig und können normal ausgeführt werden. Sitzung C fügt ein Feld hinzu. Da MDL-Schreiben und -Lesen sich gegenseitig ausschließen, wird Sitzung C blockiert. Dann beginnt Sitzung D mit der Ausführung einer Abfrageanweisung. Da Sitzung C blockiert ist, ist auch Sitzung D blockiert. Daher ist die von uns simulierte Transaktion von SessionA eine lange Transaktion, und dann wird die Tabellenstruktur geändert, was alle nachfolgenden Lese- und Schreibvorgänge für die Tabelle unmöglich macht. Daher können in tatsächlichen Szenarien bei häufigen Geschäftsanforderungen Änderungen an der Tabellenstruktur dazu führen, dass die Threads der Bibliothek blockiert werden. Die Syntax für Tabellensperren lautet wie folgt: TABELLEN SPERREN Tabellenname [[AS] Alias] Sperrtyp [, Tabellenname [[AS] Alias] Sperrtyp] ... Sperrtyp: { LESEN [LOKAL] | [NIEDRIGE_PRIORITÄT] SCHREIBEN} TABELLEN ENTSPERREN Tabellensperren werden in Lesesperren und Schreibsperren unterteilt. Lesesperren schließen sich nicht gegenseitig aus, aber nach Erhalt einer Lesesperre können keine Daten mehr geschrieben werden. Andere Sitzungen, die keine Lesesperre erhalten haben, können die Tabelle ebenfalls lesen. Der Zweck einer Lesesperre besteht also darin, das Schreiben in die Tabelle zu verhindern. Wenn die Tabelle durch eine Lesesperre gesperrt ist, wird beim Ausführen der Insert-Anweisung ein Fehler gemeldet. Der Fehler lautet wie folgt: 1099 - Tabelle 'XXXX' wurde mit einer Lesesperre gesperrt und kann nicht aktualisiert werden Nachdem die Schreibsperre aktiviert wurde, kann die Tabelle gelesen und beschrieben werden. Die Schreibsperre schließt sich gegenseitig aus. Sobald eine Sitzung die Schreibsperre einer Tabelle aktiviert hat, können andere Sitzungen nicht mehr auf die Tabelle zugreifen, bis die Schreibsperre aufgehoben wird. Die Tabelle kann mithilfe von 4. Zeilensperre (InnoDB) MySQL-Zeilensperren werden auf Engine-Ebene implementiert, daher besprechen wir hier Zeilensperren unter der InnoDB-Engine. Im Folgenden werden einige gängige Zeilensperren unter InnoDB ausführlich vorgestellt. 4.1 Gemeinsam genutzte Sperren Gemeinsam genutzte Sperren ermöglichen Transaktionen, Lesevorgänge auszuführen, nachdem die Sperre erhalten wurde. Gemeinsam genutzte Sperren schließen sich nicht gegenseitig aus. Nachdem eine Transaktion eine gemeinsam genutzte Sperre erhalten hat, kann eine andere Transaktion diese Sperre ebenfalls erhalten. Schreibvorgänge können nach dem Erhalt einer gemeinsam genutzten Sperre nicht mehr ausgeführt werden. 4.2 Exklusive Sperre Eine exklusive Sperre ermöglicht einer Transaktion, eine Zeile zu aktualisieren oder zu löschen, nachdem die Sperre erhalten wurde. Wie der Name schon sagt, ist eine exklusive Sperre gegenseitig exklusiv. Nachdem eine Transaktion eine exklusive Sperre erhalten hat, können andere Transaktionen die exklusive Sperre erst erhalten, wenn die Sperre freigegeben wird. 4.3 Absichtssperre InnoDB unterstützt Sperren mit mehreren Granularitäten, sodass Zeilensperren und Tabellensperren nebeneinander bestehen können. Die hier erwähnte beabsichtigte Sperre ist eigentlich eine Sperre auf Tabellenebene, aber ich habe sie in die Zeilensperre eingefügt, da sie nicht allein existieren wird. Ihr Auftreten wird definitiv von einer Zeilensperre (gemeinsame Sperre oder exklusive Sperre) begleitet. Ihr Hauptzweck besteht darin, anzuzeigen, dass die Zeilen in der Tabelle gesperrt werden oder gesperrt werden. Intention Locks lassen sich je nach ihrer Kombination mit Zeilensperren in folgende Typen unterteilen:
Der Erwerb der Absichtssperre muss vor dem Erwerb der Zeilensperre erfolgen, d. h. die gemeinsam genutzte Absichtssperre muss vor der gemeinsam genutzten Sperre erworben werden, und dasselbe gilt für die exklusive Sperre. Was also genau macht diese Absichtssperre? Bevor wir dies erklären, werfen wir einen Blick auf die Kompatibilitätsbeziehung zwischen Absichtssperren und Zeilensperren: |
--- | Exklusive Sperre (X) | Absichtliche exklusive Sperre (IX) | Gemeinsames Schloss (S) | Absicht Gemeinsames Schloss (IS) |
---|---|---|---|---|
Exklusive Sperre (X) | Konflikt | Konflikt | Konflikt | Konflikt |
Absichtliche exklusive Sperre (IX) | Konflikt | kompatibel | Konflikt | kompatibel |
Gemeinsames Schloss (S) | Konflikt | Konflikt | kompatibel | kompatibel |
Absicht Gemeinsames Schloss (IS) | Konflikt | kompatibel | kompatibel | kompatibel |
Wir gehen davon aus, dass es zwei Transaktionen gibt, A und B. Die Transaktion erhält eine gemeinsame Sperre und sperrt eine Zeile in der Tabelle. Diese Zeile kann nur gelesen, aber nicht geschrieben werden. Nun möchte Transaktion B eine Schreibsperre für die gesamte Tabelle beantragen. Wenn Transaktion B erfolgreich angewendet wird, kann sie definitiv in alle Zeilen der Tabelle schreiben, was definitiv mit der von A erhaltenen Zeilensperre in Konflikt gerät. Um diese Art von Konflikten zu vermeiden, führt die Datenbank eine Konflikterkennung durch. Wie erkennt man sie also? Es gibt zwei Möglichkeiten:
Bestimmen Sie, ob die Tabelle durch andere Transaktionen mit Sperren auf Tabellenebene gesperrt wurde. Bestimmen Sie, ob jede Zeile in der Tabelle durch eine Zeilensperre gesperrt ist.
Um jede Zeile in der Tabelle zu bestimmen, müssen alle Datensätze durchlaufen werden, was ineffizient ist. Daher verwendet die Datenbank die erste Methode zur Konflikterkennung, d. h. es werden Absichtssperren verwendet.
Zusammenfassen
Dieser Artikel analysiert MySQL-Sperren hauptsächlich aus der Perspektive des MySQL-Sperrbereichs. MySQL kann je nach Sperrbereich in globale Sperren, Tabellensperren und Zeilensperren unterteilt werden. Globale Sperren und Tabellensperren werden von MySQL selbst implementiert, und Zeilensperren werden auf Engine-Ebene implementiert. Zeilensperren unter InnoDB werden hauptsächlich in gemeinsam genutzte Sperren und exklusive Sperren unterteilt. Nachdem eine gemeinsame Sperre angefordert wurde, kann die Zeile nur gelesen werden und gemeinsame Sperren schließen sich nicht gegenseitig aus. Nachdem die exklusive Sperre erworben wurde, kann die Zeile aktualisiert und gelöscht werden. Die exklusive Sperre schließt sich gegenseitig mit anderen Sperren aus. Abschließend habe ich die auf der Zeilensperre basierende Absichtssperre erwähnt. Die Absichtssperre bedeutet hauptsächlich, dass die Zeile gesperrt wird oder gesperrt werden soll, um die Effizienz bei der Erkennung von Sperrkonflikten zu verbessern. Natürlich gibt es unter InnoDB auch andere Sperren, wie z. B. Lückensperren, Datensatzsperren, Next-Key-Sperren usw. Diese fallen nicht in den Rahmen dieses Artikels. Wenn Sie interessiert sind, können Sie sie selbst studieren.
Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.
<<: So führen Sie .sh-Dateien im Linux-System aus
>>: Der gesamte Prozessbericht der Vue-Exportfunktion für Excel
Wenn wir TypeScript verwenden, möchten wir das vo...
Eine direkte Verwendung von Breite und Höhe ist ni...
Vorwort: MYSQL dürfte die beliebteste WEB-Backend...
1. Problembeschreibung: MysqlERROR1698 (28000)-Lö...
Manchmal müssen wir bei unserer tatsächlichen Arb...
WML (Wireless Markup Language). Es handelt sich u...
Inhaltsverzeichnis 1. Kern 1. Holen Sie sich den ...
Vorwort Wie wir alle wissen, ist JavaScript im Ke...
Nachdem IntelliJ IDEA ein Javaweb-Projekt mit Tom...
Als ich kürzlich Hausaufgaben machte, musste ich e...
Durch dreimaliges Auswendiglernen können Sie sich...
#Case: Gehaltsstufen von Mitarbeitern abfragen WÄ...
Lassen Sie mich zunächst die Anwendungsmethode er...
1. Einfache Konfiguration der dynamischen und sta...
Im vorherigen Artikel haben wir erklärt, wie ngin...