Anfänger verstehen das MySQL-Deadlock-Problem anhand des Quellcodes

Anfänger verstehen das MySQL-Deadlock-Problem anhand des Quellcodes

Nach vielen schwierigen Einzelschritt-Debuggings spät in der Nacht habe ich endlich einen idealen Haltepunkt gefunden. Ich kann sehen, dass der Großteil des Codes für den Sperrenerwerbsprozess in der static enum db_err lock_rec_lock() Funktion von lock0lock.c enthalten ist. Diese Funktion zeigt den Prozess des Sperrenerwerbs an und zeigt an, ob der Sperrenerwerb erfolgreich war oder nicht.

Szenario 1: Löschen nach Primärschlüssel

Tabellenstruktur

TABELLE ERSTELLEN `t1` (
 `id` int(11) NICHT NULL AUTO_INCREMENT,
 `name` varchar(10) NICHT NULL STANDARD '',
 PRIMÄRSCHLÜSSEL (`id`)
)ENGINE=InnoDB;

Löschen Sie aus t1, wo ID = 10;

Wie Sie sehen, ist der Index PRIMARY gesperrt, Modus = 1027. Was bedeutet 1027? 1027 = LOCK_REC_NOT_GAP + LOCK_X (Non-Gap-Datensatzsperre und X-Sperre)

Der Ablauf ist wie folgt

Fazit: Um Daten basierend auf der Primärschlüssel-ID und ohne andere Indizes zu löschen, muss diese SQL-Anweisung nur eine X-Sperre zum Primärschlüsselindex des Datensatzes mit der ID = 10 hinzufügen.

Szenario 2: Löschen über einen eindeutigen Index

Die Tabellenstruktur wurde leicht angepasst und ein eindeutiger Namensindex hinzugefügt.

Daten konstruieren CREATE TABLE `t2` (
 `id` int(11) NICHT NULL AUTO_INCREMENT,
 `name` varchar(10) NICHT NULL STANDARD '',
 Primärschlüssel (`id`),
 EINZIGARTIGER SCHLÜSSEL `uk_name` (`name`)
) ;
WERTE IN `t2` (`id`, `name`) EINFÜGEN 
 (1,'M'),
 (2,'J'),
 (3,'S'),
 (4,'Q'),
 (5,'L');
 
Testen Sie die SQL-Anweisung „Löschen von t2“, wobei Name = „Y“ ist.

Schauen wir uns die Ergebnisse des tatsächlichen Quellcode-Debuggings an

Erster Schritt:

Schritt 2:

Fazit: Dieser Prozess fügt zuerst eine X-Sperre zum eindeutigen Schlüssel uk_name und dann eine X-Sperre zum Clustered-Index (Primärschlüsselindex) hinzu.

Der Ablauf ist wie folgt

Szenario 3: Löschen über einen normalen Index

Daten konstruieren CREATE TABLE `t3` (
 `id` int(11) NICHT NULL AUTO_INCREMENT,
 `name` varchar(10) NICHT NULL STANDARD '',
 Primärschlüssel (`id`),
 SCHLÜSSEL `idx_name` (`Name`) 
);
WERTE IN `t3` (`id`, `name`) EINFÜGEN 
 (1,'N'),
 (2,'G'),
 (3,'Ich'),
 (4,'N'),
 (5,'X');
 
Testanweisung:
Löschen Sie aus t3, wo Name = „N“;

Der Debugging-Prozess ist in der Abbildung dargestellt:

Fazit: Beim Aktualisieren über einen gemeinsamen Index wird allen gemeinsamen Indizes, die die Bedingungen erfüllen, eine X-Sperre hinzugefügt, und den zugehörigen Primärschlüsselindizes wird eine X-Sperre hinzugefügt.

Der Ablauf ist wie folgt

Szenario 4: Löschen ohne Verwendung des Index

TABELLE ERSTELLEN `t4` (
 `id` int(11) NICHT NULL AUTO_INCREMENT,
 `name` varchar(10) NICHT NULL STANDARD '',
 PRIMÄRSCHLÜSSEL (`id`)
)

WERTE IN `t4` (`id`, `name`) EINFÜGEN 
 (1,'M'),
 (2,'J'),
 (3,'S'),
 (4,'Q'),
 (5,'L');
 
Löschen Sie aus t4, wo Name = "S";

Insgesamt gibt es 5 X-Schlösser, die restlichen 3 werden nicht einzeln aufgeführt.

Fazit: Beim Aktualisieren ohne Verwendung des Index durchsucht SQL die gesamte Tabelle mithilfe des gruppierten Index (Primärschlüsselindex), sodass jeder Datensatz gesperrt wird, unabhängig davon, ob er die Bedingungen erfüllt oder nicht. Es ist noch nicht vorbei…

Aus Effizienzgründen hat MySQL jedoch eine Optimierung vorgenommen. Für Datensätze, die die Bedingungen nicht erfüllen, werden die Sperren nach einer Beurteilung freigegeben. Die endgültigen Sperren sind diejenigen für Datensätze, die die Bedingungen erfüllen, aber die Sperr-/Freigabeaktionen für Datensätze, die die Bedingungen nicht erfüllen, werden nicht ausgelassen.

Der Ablauf ist wie folgt

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.

Das könnte Sie auch interessieren:
  • Beispiel für eine Analyse des MySQL-Deadlock-Problems und eine Lösung
  • Mysql verwendet den Kill-Befehl, um das Deadlock-Problem zu lösen (eine bestimmte SQL-Anweisung, die ausgeführt wird, abzubrechen).
  • Fehlerbehebung beim MySQL-Redo-Deadlock-Problem und Analyse des Lösungsprozesses
  • Analyse des Purge-Deadlock-Problems in der MySQL-Datenbank
  • Detaillierte Analyse von MySQL-Deadlock-Problemen

<<:  Syntax und Beispielanalyse der JavaScript-Array-Methode „reduce()“

>>:  Detailliertes Tutorial zur Überwachung von Nginx/Tomcat/MySQL mit Zabbix

Artikel empfehlen

MySQL Installations-Tutorial unter Windows mit Bildern und Text

Anweisungen zur MySQL-Installation MySQL ist ein ...

In einem Artikel erfahren Sie, wie Sie ein Vue-Plugin schreiben

Inhaltsverzeichnis Was ist ein Plugin Plugins sch...

Das WeChat-Applet implementiert den Wasserfallfluss, Paging, Scrollen und Laden

In diesem Artikel wird der spezifische Code für d...

Gründe und Lösungen für das Versagen des React-Ereignisdrosselungseffekts

Inhaltsverzeichnis Das Problem hierbei ist: Lösun...

Zusammenfassung der MySQL-Verbundindizes

Inhaltsverzeichnis 1. Hintergrund 2. Zusammengese...

Detaillierte Erklärung der MySQL-Zeichenfolgenverkettungsfunktion GROUP_CONCAT

Im vorherigen Artikel habe ich ein tabellenübergr...

Docker mountet lokale Verzeichnisse und Datenvolumen-Container-Operationen

1. Docker mountet das lokale Verzeichnis Docker k...

jQuery-Plugin zur Implementierung des Minesweeper-Spiels (1)

Dieser Artikel teilt den spezifischen Code des er...

Drei Möglichkeiten zum Konfigurieren einer JNDI-Datenquelle in Tomcat

In meiner früheren Arbeit war der Entwicklungsser...

Beispiel für eine geplante MySQL-Datenbanksicherung

Dieser Artikel beschreibt das Beispiel eines gepl...

Verwenden Sie die Renderfunktion, um hoch skalierbare Komponenten zu kapseln

brauchen: In der Hintergrundverwaltung gibt es hä...

Vue implementiert Dialogkapselung

Inhaltsverzeichnis Vue2-Schreiben Schreiben der V...

Detaillierte Erklärung der Verwendung von overflow:auto

Bevor ich mit dem Haupttext beginne, werde ich ei...

Grundlegende Konzepte und allgemeine Methoden des Map-Mappings in ECMAScript6

Inhaltsverzeichnis Was ist eine Zuordnung? Unters...