Verstehen von MySQL-Deadlock-Routinen durch eindeutige Index-S-Sperre und X-Sperre

Verstehen von MySQL-Deadlock-Routinen durch eindeutige Index-S-Sperre und X-Sperre

In „MySQL-Deadlock-Probleme anhand des Quellcodes verstehen“ für Anfänger haben wir den Prozess des Debuggens des MySQL-Quellcodes zum Erkennen von Deadlocks vorgestellt. In diesem Artikel wird ein häufiger Fall behandelt.
Dieses Mal werden wir über die Hassliebe zwischen dem einzigartigen Index S-Sperre und der X-Sperre sprechen.

Schauen wir uns ein vereinfachtes Beispiel an

# Daten konstruieren CREATE TABLE `t1` (
 `id` int(11) NICHT NULL AUTO_INCREMENT,
 `Name` varchar(10),
 `Ebene` int(11),
 Primärschlüssel (`id`),
 EINZIGARTIGER SCHLÜSSEL `uk_name` (`name`)
);
INSERT INTO `t1` (`Name`, `Ebene`) VALUES ('A',0);

# Die problematische SQL-Anweisung lautet wie folgt und führt in gleichzeitigen Situationen zu einem Deadlock: INSERT ignore INTO `t1` (`name`, `level`) VALUES ('A',0);
Aktualisiere t1, setze Level = 1, wobei Name = „A“ ist;

Wir verwenden die zuvor vorgestellte Methode zur Quellcodeanalyse, um zunächst zu untersuchen, welche Sperren diesen beiden Anweisungen hinzugefügt werden, und analysieren dann den Prozess der Deadlock-Bildung.

Erste Aussage

INSERT ignore INTO t1 (Name, Ebene) VALUES ('A',0);

Die beim Debuggen erzielten Ergebnisse sind wie folgt

Sie können sehen, dass diese Anweisung dem eindeutigen Schlüssel uk_name eine gemeinsame Sperre (S-Sperre) hinzufügt und erfolgreich ist.

Die zweite Aussage

Aktualisiere t1, setze Level = 1, wobei Name = „A“ ist;

Aktualisiert ein Datenbankfeld mit einem eindeutigen Schlüssel.

Diese Situation wurde im vorherigen Artikel vorgestellt. Dem eindeutigen Index wird eine X-Sperre hinzugefügt, und dann wird die X-Sperre dem Primärschlüsselindex hinzugefügt.

Auf diese Weise lässt sich das Deadlock-Problem sehr einfach reproduzieren. Die Schritte sind wie folgt

1. Öffnen Sie zwei Sitzungen, beginnen Sie
2.session1 führt INSERT ignore INTO t1 (name, level) VALUES ('A',0) aus;
3.session2 führt INSERT ignore INTO t1 (name, level) VALUES ('A',0) aus;
4.session1 führt update t1 set level = 1 where name = "A" aus und wechselt in den Wartezustand
5. Session2 führt update t1 set level = 1 where name = "A"; aus, es kommt zu einem Deadlock und es wird ein Rollback durchgeführt, während Transaktion 1 erfolgreich ausgeführt wird

Die detaillierten Änderungen des Sperrstatus sind wie folgt

t1 t2 Bemerkung
IGNORE EINFÜGEN IN - t1 erhält erfolgreich die S-Sperre von ukDB_SUCCESS
- IGNORE EINFÜGEN IN t2 erhält erfolgreich die S-Sperre von ukDB_SUCCESS
AKTUALISIEREN - t1 versucht, das X-Lock von uk zu erhalten, scheitert jedoch und befindet sich im Wartezustand DB_LOCK_WAIT
- AKTUALISIEREN t2 versucht, das X-Lock von uk zu erhalten und findet einen Deadlock, wodurch DB_DEADLOCK generiert wird.
- Deadlock t2 S-Verriegelung lösen
Erfolg - -

Das Deadlock-Protokoll sieht wie folgt aus:

Zuletzt erkannter Deadlock
------------------------
181208 23:00:52
*** (1) TRANSAKTION:
TRANSAKTION 53A7, AKTIV 162 Sek. Start des Indexlesens
MySQL-Tabellen in Verwendung 1, gesperrt 1
LOCK WAIT 3 Sperrstruktur(en), Heap-Größe 376, 2 Zeilensperren
MySQL-Thread-ID 12, OS-Thread-Handle 0x700010522000, Abfrage-ID 1424, Localhost-Root, Aktualisierung
Update t1, setze Level = 1, wobei Name = „A“
*** (1) WARTEN AUF DIE GEWÄHRUNG DIESER SPERRE:
Datensatzsperren, Bereichs-ID 89, Seitennummer 4, n Bits 72, Index „uk_name“ der Tabelle „lock_demo2“. „t1“ TRX-ID 53A7, Sperrmodus X sperrt Datensatz, aber nicht Lückenwartezeit
Datensatzsperre, Heap Nr. 2 PHYSIKALISCHER DATENSATZ: n_Felder 2; kompaktes Format; Infobits 0
 0: Länge 1; Hex 41; aufsteigend A;;
 1: Länge 4; Hex 80000001; aufsteigend ;;

*** (2) TRANSAKTION:
TRANSAKTION 53A8, AKTIV 8 Sek. Start des Indexlesens
MySQL-Tabellen in Verwendung 1, gesperrt 1
3 Sperrstruktur(en), Heap-Größe 376, 2 Zeilensperren
MySQL-Thread-ID 96, OS-Thread-Handle 0x70001062e000, Abfrage-ID 1425, Localhost-Root, Aktualisierung
Update t1, setze Level = 1, wobei Name = „A“
*** (2) HÄLT DAS SCHLOSS:
Datensatzsperren, Bereichs-ID 89, Seitennummer 4, n Bits 72, Index „uk_name“ der Tabelle „lock_demo2“. „t1“ TRX-ID 53A8, Sperrmodus S
Datensatzsperre, Heap Nr. 2 PHYSIKALISCHER DATENSATZ: n_Felder 2; kompaktes Format; Infobits 0
 0: Länge 1; Hex 41; aufsteigend A;;
 1: Länge 4; Hex 80000001; aufsteigend ;;

*** (2) WARTEN AUF DIE GEWÄHRUNG DIESER SPERRE:
Datensatzsperren, Bereichs-ID 89, Seitennummer 4, n Bits 72, Index „uk_name“ der Tabelle „lock_demo2“. „t1“ TRX-ID 53A8, Sperrmodus X sperrt Datensatz, aber nicht Lückenwartezeit
Datensatzsperre, Heap Nr. 2 PHYSIKALISCHER DATENSATZ: n_Felder 2; kompaktes Format; Infobits 0
 0: Länge 1; Hex 41; aufsteigend A;;
 1: Länge 4; Hex 80000001; aufsteigend ;;

*** WIR MACHEN DIE TRANSAKTION ZURÜCK (2)

Schauen wir uns dieses Deadlock-Protokoll genauer an

*** (1) WARTEN AUF DIE GEWÄHRUNG DIESER SPERRE:
Datensatzsperren Speicherplatz-ID 89 Seitennummer 4 n Bits 72 Index uk_Name der Tabelle lock_demo2.t1 trx-ID 53A7 Sperrmodus X sperrt Datensatz, aber nicht Lückenwarte

Transaktion 1 möchte eine X-Sperre (Non-Gap-Lock-Datensatzsperre) für den eindeutigen Index uk_name erhalten.

*** (2) HÄLT DAS SCHLOSS:
Datensatzsperren Bereichs-ID 89 Seitennummer 4 n Bits 72 Index uk_Name der Tabelle lock_demo2.t1 trx-ID 53A8 Sperrmodus S

Transaktion 2 hält eine S-Sperre (gemeinsame Sperre) für den eindeutigen Index uk_name

*** (2) WARTEN AUF DIE GEWÄHRUNG DIESER SPERRE:
Datensatzsperren Speicherplatz-ID 89 Seitennummer 4 n Bits 72 Index uk_Name der Tabelle lock_demo2.t1 trx-ID 53A8 Sperrmodus X sperrt Datensatz, aber nicht Lückenwarte

Transaktion 2 möchte eine X-Sperre (Datensatzsperre ohne Lückensperre) für den eindeutigen Index uk_name erhalten.
Dies steht im Einklang mit den vorherigen theoretischen Schlussfolgerungen.

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:
  • Lösen Sie die MySQL-Deadlock-Routine, indem Sie verschiedene Indizes aktualisieren
  • Analyse eines MySQL-Deadlock-Szenariobeispiels
  • Detaillierte Erklärung, wie MySQL (InnoDB) mit Deadlocks umgeht
  • Beispiele für optimistisches und pessimistisches Sperren in MySQL
  • Mysql fragt die ausgeführten Transaktionen ab und wie auf Sperren gewartet werden soll
  • Ein kurzes Verständnis der relevanten Sperren in MySQL

<<:  So verwenden Sie JavaScript, um die am häufigsten wiederholten Zeichen in einer Zeichenfolge abzurufen

>>:  Detaillierte Erklärung der grundlegenden Verwendung der Hilfsfunktion MapGetters in Vuex

Artikel empfehlen

PNG-Alpha-Transparenz in IE6 (vollständige Sammlung)

Viele Leute sagen, dass IE6 PNG-Transparenz nicht...

Lösung für das Fehlerproblem bei der Remote-Verbindung von Vscode zu Ubuntu

1. Hintergrund des Vorfalls: Aus Arbeitsgründen m...

Installations-Tutorial für die ZIP-Archivversion von MySQL 5.7

In diesem Artikel finden Sie das Installations-Tu...

Detaillierte Erklärung der Bedeutung von N und M im MySQL-Datentyp DECIMAL(N,M)

Ein Kollege fragte mich, was N und M im MySQL-Dat...

So zeigen Sie Bildinformationen in Docker an

In diesem Artikel müssen wir lernen, wie man Bild...

Zusammenfassung der Methoden zum Bereinigen von Mysql general_log

Methode 1: GLOBAL festlegen general_log = "A...

Tatsächlicher Datensatz zur Wiederherstellung der MySQL-Datenbank nach Zeitpunkt

Einführung: MySQL-Datenbankwiederherstellung nach...

Implementierung der Docker-Bereitstellung eines MySQL-Clusters

Nachteile einer Single-Node-Datenbank Große Inter...

JavaScript-Methode zum Erkennen des Dateityps

Inhaltsverzeichnis 1. So zeigen Sie die Binärdate...

Implementierungsmethode für den React State-Zustand und Lebenszyklus

1. Methoden zur Implementierung von Komponenten:組...

Bei der Verwendung von MySQL aufgetretene Probleme

Hier sind einige Probleme, die bei der Verwendung...