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

Analyse des Docker-Compose-Image-Release-Prozesses des Springboot-Projekts

Einführung Das Docker-Compose-Projekt ist ein off...

Vue implementiert die Anmeldung per Mobiltelefon-Bestätigungscode

In diesem Artikel wird der spezifische Code von V...

Detaillierter Prozess der Bereitstellung von Docker für WSL2 in IDEA

Die lokale Umgebung ist Windows 10 + WSL2 (Ubuntu...

JDBC-Erkundung SQLException-Analyse

1. Übersicht über SQLException Wenn bei der Verwe...

Implementierung einer Login-Seite basierend auf layui

In diesem Artikelbeispiel wird der spezifische Co...

So installieren Sie Oracle auf Windows Server 2016

1. Installieren Sie Oracle. Im Internet gibt es z...

Zusammenfassung der allgemeinen Bedienungskenntnisse der MySQL-Datenbank

Dieser Artikel fasst gängige Betriebstechniken fü...

37 Tipps für ein gutes User Interface Design (mit Bildern)

1. Versuchen Sie, ein einspaltiges statt eines meh...

Wie wird eine SQL-Anweisung in MySQL ausgeführt?

Inhaltsverzeichnis 1. Analyse der MySQL-Architekt...

Tutorial-Diagramm zur Installation von TomCat unter Windows 10

Installieren Sie TomCat unter Windows Dieser Arti...