Tiefgreifendes Verständnis der verschiedenen Sperren von MySQL

Tiefgreifendes Verständnis der verschiedenen Sperren von MySQL

Schlossübersicht

Eine Sperre ist ein Mechanismus, mit dem ein Computer mehrere Prozesse oder Threads koordiniert, um auf eine Ressource zuzugreifen.

In der Datenbank sind Daten neben der Konkurrenz um herkömmliche Computerressourcen (wie CPU, RAM, E/A usw.) auch eine Ressource, die von vielen Benutzern gemeinsam genutzt wird. Wenn die Konsistenz und Gültigkeit des gleichzeitigen Datenzugriffs gewährleistet werden soll, ist dies ein Problem, das alle Datenbanken lösen müssen. Sperrkonflikte sind auch ein wichtiger Faktor, der die gleichzeitige Zugriffsleistung der Datenbank beeinflusst. Aus dieser Perspektive sind Sperren für Datenbanken besonders wichtig und komplexer.

Sperrklassifizierung

Granularität von Datenbankoperationen

Tabellensperren:
	Während der Operation ist die gesamte Tabellenzeilensperre gesperrt:
	Während der Bedienung wird die aktuelle Bedienzeile gesperrt.

Arten von Datenoperationen

Lesesperre (gemeinsame Sperre):
	Für dieselben Daten können mehrere Lesevorgänge gleichzeitig ausgeführt werden, ohne dass die Schreibsperren (exklusive Sperren) der anderen beteiligt sind:
	Bis der Vorgang abgeschlossen ist, werden andere Schreib- und Lesesperren blockiert

MySQL-Sperre

Im Vergleich zu anderen Datenbanken ist der Sperrmechanismus von MySQL relativ einfach. Sein bemerkenswertestes Merkmal ist, dass verschiedene Speicher-Engines unterschiedliche Sperrmechanismen unterstützen.

Von verschiedenen Speicher-Engines unterstützte Sperrebenen

Speicher-Engine Tabellensperre Sperren auf Zeilenebene Seitensperre
MeinIsAM Unterstützung Wird nicht unterstützt Wird nicht unterstützt
InnoDB Unterstützung Unterstützung Wird nicht unterstützt
ERINNERUNG Unterstützung Wird nicht unterstützt Wird nicht unterstützt
BDB Unterstützung Wird nicht unterstützt Unterstützung

Einführung zum Schloss

Es ist schwierig, allgemein zu sagen, welches Schloss besser ist. Es muss anhand spezifischer Anwendungsszenarien analysiert werden, welches Schloss besser geeignet ist.

Sperrtyp Merkmale
Tabellensperre Es bevorzugt die MyISAM-Speicher-Engine, die einen geringen Overhead und schnelle Sperren aufweist. Es verursacht keine Deadlocks. Es verfügt über eine hohe Sperrgranularität, die höchste Wahrscheinlichkeit für das Senden von Sperrkonflikten und die niedrigste Parallelität.
Sperren auf Zeilenebene Es handelt sich in der Regel um die InnoDB-Speicher-Engine, die einen hohen Overhead und langsame Sperren aufweist. Deadlocks können auftreten. Sie hat die kleinste Sperrgranularität, die geringste Wahrscheinlichkeit von Sperrkonflikten und die höchste Parallelität.
Seitensperre Der Overhead und die Sperrzeit liegen zwischen Tabellensperren und Zeilensperren. Es können Deadlocks auftreten. Die Sperrgranularität liegt zwischen Tabellensperren und Zeilensperren und die Parallelität ist durchschnittlich.

MyISAM-Tabellensperren

So fügen Sie eine Tabellensperre hinzu

Vor der Ausführung einer Abfrageanweisung (select) sperrt MyISAM automatisch alle beteiligten Tabellen. Vor der Ausführung eines Aktualisierungsvorgangs (aktualisieren, löschen, einfügen usw.) fügt es den beteiligten Tabellen automatisch eine Schreibsperre hinzu. Dieser Vorgang erfordert kein Eingreifen des Benutzers. Daher müssen Benutzer im Allgemeinen nicht direkt den Befehl LOCK TABLE verwenden, um die MyISAM-Tabelle explizit zu sperren.

Freischalten

Lesesperre hinzufügen:
	Sperrtabelle Tabellenname lesen; 
	---Tabellen entsperren;
Schreibsperre hinzufügen:
	Tabelle sperren Tabellenname schreiben;
	Fügen Sie eine Schreibsperre hinzu. Die aktuelle Sitzung kann lesen und schreiben, und andere Sitzungen werden blockiert (warten). Lesesperren schränken das Schreiben ein, und Schreibsperren schränken das Lesen und Schreiben ein.

Sperrkonflikte

1. Lesevorgänge auf MyISAM-Tabellen blockieren nicht die Leseanforderungen anderer Benutzer für dieselbe Tabelle, blockieren jedoch die Schreibanforderungen für dieselbe Tabelle.
2. Schreibvorgänge auf MyISAM blockieren die Lese- und Schreibvorgänge anderer Benutzer auf Tabelle 1.
3. Die Sperrplanung von MyISAM erfolgt zuerst nach dem Schreibprinzip.
	Es ist nicht als Haupttabelle geeignet. Nach dem Schreiben der Sperre erschweren eine große Anzahl von Aktualisierungen durch andere Threads die Abfrage, die Sperre zu erhalten, was zu einer dauerhaften Blockierung führen kann.

Sperrennutzung

Überprüfen Sie die Verwendung von Sperren, um offene Tabellen anzuzeigen.
Überprüfen Sie den Sperrstatus der Tabelle, zeigen Sie einen Status wie „table_locks%“ an.
		Table_locks_immediate: Die Häufigkeit, mit der eine Sperre auf Tabellenebene erworben werden kann. Der Wert erhöht sich bei jedem sofortigen Sperrenerwerb um 1.
		Table_locks_waited: Die Anzahl der Wartezeiten, wenn Sie die Sperre nicht sofort erhalten können. Der Wert erhöht sich bei jeder Wartezeit um 1. Damit lässt sich die Schwere von Sperrkonflikten auf Tabellenebene bestimmen.	

InnoDB-Sperren

Die größten Unterschiede zwischen InnoDB und MyISAM sind: Erstens unterstützt es Transaktionen; zweitens verwendet es Sperren auf Zeilenebene

Zeilensperre

Gemeinsam genutzte Schlösser:
	Auch als Lesesperre bekannt. Mehrere Transaktionen können eine Sperre gemeinsam nutzen, können aber nur exklusive Sperren lesen, nicht schreiben:
	Sperren, auch als Schreibsperre bekannt, werden nicht gemeinsam genutzt. Transaktionen, die keine Sperren erhalten können, können keine Lese- und Schreibvorgänge ausführen. Wenn Update-, Lösch- und Einfügeanweisungen ausgeführt werden, fügt innoDB den betreffenden Datensätzen automatisch exklusive Sperren hinzu. Anderen Select-Anweisungen werden keine Sperren hinzugefügt. Abfragen werden explizit Sperren hinzugefügt. Gemeinsam genutzte Sperren hinzufügen:
		select * from table_name where ... Sperren im Freigabemodus
	Fügen Sie eine exklusive Sperre hinzu:
		Wählen Sie * aus Tabellenname, wobei ... FÜR UPDATE

Sperreskalation

Indexfehler, Zeilensperre wird zu Tabellensperre aktualisiert, wenn kein Index dahinter steht, wird auch zu Tabellensperre aktualisiert

Lückensperre

InnoDB sperrt auch Daten, die in der Lücke nicht vorhanden sind, was als Lückensperre bezeichnet wird.

Sperrkonflikte

Status wie „innodb_row_lock%“ anzeigen;
	Innodb_row_lock_current_waits Die Anzahl der aktuell wartenden Sperren. Innodb_row_lock_time Die Gesamtdauer der Sperre. Innodb_row_lock_time_avg Die durchschnittliche Dauer der Sperre. Innodb_row_lock_time_max Die maximale Dauer der Sperre. Innodb_row_lock_waits Die Gesamtzahl der Wartezeiten seit dem Systemstart.

Zusammenfassen

Die Speicher-Engine innoDB implementiert Zeilensperren. Obwohl der Leistungsverbrauch durch die Implementierung des Sperrmechanismus höher sein kann als der von Tabellensperren, ist er MyISAM-Tabellensperren in Bezug auf die Gesamtkapazität gleichzeitiger Verarbeitung weit überlegen. Wenn die Systemparallelität relativ hoch ist, ist die Gesamtleistung von InnoDB gegenüber MyISAM deutlich besser.

Optimierungsvorschläge

Versuchen Sie, alle Datenabrufe über Indizes durchzuführen, um zu vermeiden, dass Zeilensperren ohne Index zu Tabellensperren aufgewertet werden. Entwerfen Sie Indizes sinnvoll und minimieren Sie den Umfang der Sperren. Minimieren Sie Indexbedingungen und Indexbereiche, um Lückensperren zu vermeiden. Versuchen Sie, die Transaktionsgröße zu kontrollieren und die Menge der gesperrten Ressourcen und die Dauer zu reduzieren. Verwenden Sie so weit wie möglich eine Transaktionsisolierung auf niedriger Ebene (Geschäftsanforderungen müssen erfüllt werden).

Dies ist das Ende dieses Artikels über ein vertieftes Verständnis verschiedener MySQL-Sperren. Weitere relevante Inhalte zu MySQL-Sperren finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • MySQL-Implementierung für pessimistisches und optimistisches Sperren
  • Die umfassendste Erklärung des Sperrmechanismus in MySQL
  • Ein kurzes Verständnis der relevanten Sperren in MySQL

<<:  Detaillierter Prozess zum Ändern der Apt-Quelle in die Alibaba Cloud-Quelle in Ubuntu 18.04

>>:  Verwenden Sie CSS, um einige häufig auftretende seltsame Schaltflächen einfach zu implementieren

Artikel empfehlen

Detaillierte Erklärung zur Konfiguration einer statischen IP in Centos8

Nach der Installation von CentOS 8 wird beim Neus...

Detaillierte Erklärung der MySQL-Datenbank-Trigger

Inhaltsverzeichnis 1 Einleitung 2 Trigger-Einführ...

Anwendungsszenarien und Lösungen für die MySQL-Komprimierung

Einführung Beschreibt die Anwendungsfälle und Lös...

Verwendung der Linux Dynamic Link Library

Im Vergleich zu gewöhnlichen Programmen haben dyn...

Implementierung langer Textschatten in Less in CSS3

Dieser Artikel stellt hauptsächlich die Implement...

Implementierung von React-Loop-Daten (Liste)

Lassen Sie uns zunächst die Daten simulieren, die...

Docker realisiert die Verbindung mit demselben IP-Netzwerksegment

Vor Kurzem habe ich das Problem gelöst, dass Dock...

Ein Beispiel für die Verwendung von CSS-Methoden zur Erzielung von Modularität

1. Was sind CSS-Methoden? CSS methodologies könne...

JavaScript zum Wechseln zwischen mehreren Bildern

In diesem Artikel wird der spezifische JavaScript...

Analysieren Sie die Dauer von TIME_WAIT aus dem Linux-Quellcode

Inhaltsverzeichnis 1. Einleitung 2. Lassen Sie un...

Tutorial zum Migrieren von Projekten von MYSQL zu MARIADB

Bereiten Sie die Datenbank (MySQL) vor. Wenn Sie ...

Beispiel für die Konfiguration mehrerer virtueller Hosts in nginx

Es ist sehr praktisch, den virtuellen Host vhost ...

So legen Sie die Umgebungsvariable PATH im Linux-System fest (3 Methoden)

1. In Windows-Systemen erfordern viele Softwarein...

So installieren Sie eine ISO-Datei im Linux-System

Wie installiere ich ISO-Dateien unter einem Linux...