Lösen Sie die MySQL-Deadlock-Routine, indem Sie verschiedene Indizes aktualisieren

Lösen Sie die MySQL-Deadlock-Routine, indem Sie verschiedene Indizes aktualisieren Die zweite Aussage

Aktualisiere t3, setze b = '', wobei b = "2"; 

Um das Problem zu beheben, wurden 3 X-Sperren in der folgenden Reihenfolge hinzugefügt:

In den vorherigen Artikeln wurde erläutert, wie Sperrinformationen mithilfe des Quellcodes debuggt werden. Hier verwenden wir dieses Tool auch, um einen tatsächlichen Online-Deadlock-Fall zu lösen. Dabei handelt es sich auch um die ersten beiden von uns vorgestellten SQL-Anweisungen, die einen Deadlock verursacht haben. Da die Online-Tabellenstruktur relativ komplex ist, werden einige Vereinfachungen wie folgt vorgenommen

TABELLE ERSTELLEN `t3` (
 `id` int(11) NICHT NULL AUTO_INCREMENT,
 `ein` varchar(5),
 `b` varchar(5),
 Primärschlüssel (`id`),
 EINZIGARTIGER SCHLÜSSEL `uk_a` (`a`),
 SCHLÜSSEL `idx_b` (`b`) 
)
WERTE IN `t3` (`id`, `a`, `b`) EINFÜGEN 
 (1,'1','2');
# Die SQL-Anweisung lautet wie folgt# Transaktion 1: t1
Aktualisiere t3, setze b = '', wobei a = "1";

# Transaktion 2: t2
Aktualisiere t3, setze b = '', wobei b = "2";


Die Situation, in der die beiden Anweisungen einen Deadlock verursachen, lässt sich manuell nur schwer reproduzieren. Lassen Sie uns zunächst den Sperrvorgang analysieren.

Die erste Anweisung (Aktualisierung des Datensatzes über den eindeutigen Index)

Aktualisiere t3, setze b = '', wobei a = "1"; 

Nach Abschluss wurden 3 X-Schlösser in der folgenden Reihenfolge hinzugefügt:

Seriennummer Index Sperrtyp
1 uk_a X
2 PRIMÄR X
3 idx_b X

Seriennummer Index Sperrtyp
1 idx_b X
2 PRIMÄR X
3 idx_b X

Aufgrund der Reihenfolge der Sperren scheinen die beiden Anweisungen die Voraussetzungen für einen Deadlock zu erfüllen.

Eine manuelle Simulation ist schwierig. Wenn Sie einen Code schreiben, der die beiden SQL-Anweisungen gleichzeitig ausführt, tritt sofort ein Deadlock auf.

------------------------
Zuletzt erkannter Deadlock
------------------------
181102 12:45:05
*** (1) TRANSAKTION:
TRANSAKTION 50AF, AKTIV 0 Sek. Startindex lesen
MySQL-Tabellen in Verwendung 1, gesperrt 1
LOCK WAIT 3 Sperrstruktur(en), Heap-Größe 376, 2 Zeilensperren
MySQL-Thread-ID 34, OS-Thread-Handle 0x70000d842000, Abfrage-ID 549 localhost 127.0.0.1 root Durchsuche Zeilen für Update
update t3 setze b = '' wobei b = "2"
*** (1) WARTEN AUF DIE GEWÄHRUNG DIESER SPERRE:
Datensatzsperren, Speicherplatz-ID 67, Seitennummer 3, n Bits 72, Index „PRIMARY“ der Tabelle „d1“. „t3“, TRX-ID 50AF, Sperrmodus X sperrt Datensatz, aber nicht Lückenwartezeit
Datensatzsperre, Heap Nr. 2 PHYSIKALISCHER DATENSATZ: n_Felder 5; kompaktes Format; Infobits 0
 0: Länge 4; Hex 80000001; aufsteigend ;;
 1: Länge 6; Hex 0000000050ae; aufsteigend P ;;
 2: Länge 7; Hex 03000001341003; aufsteigend 4 ;;
 3: Länge 1; Hex 31; aufsteigend 1;;
 4: Länge 0; hex; aufsteigend ;;

*** (2) TRANSAKTION:
TRANSAKTION 50AE, AKTIV 0 Sek. Aktualisieren oder Löschen
MySQL-Tabellen in Verwendung 1, gesperrt 1
4 Sperrstruktur(en), Heapgröße 1248, 3 Zeilensperre(n), Undo-Logeinträge 1
MySQL-Thread-ID 35, OS-Thread-Handle 0x70000d885000, Abfrage-ID 548 localhost 127.0.0.1 root Aktualisierung
update t3 setze b = '' wobei a = "1"
*** (2) HÄLT DAS SCHLOSS:
RECORD LOCKS Bereichs-ID 67 Seitennummer 3 n Bits 72 Index `PRIMARY` der Tabelle `d1`.`t3` TRX-ID 50AE Sperrmodus X sperrt Datensatz, aber nicht Lücke
Datensatzsperre, Heap Nr. 2 PHYSIKALISCHER DATENSATZ: n_Felder 5; kompaktes Format; Infobits 0
 0: Länge 4; Hex 80000001; aufsteigend ;;
 1: Länge 6; Hex 0000000050ae; aufsteigend P ;;
 2: Länge 7; Hex 03000001341003; aufsteigend 4 ;;
 3: Länge 1; Hex 31; aufsteigend 1;;
 4: Länge 0; hex; aufsteigend ;;

*** (2) WARTEN AUF DIE GEWÄHRUNG DIESER SPERRE:
Datensatzsperren, Speicherplatz-ID 67, Seitennummer 5, n Bits 72, Index „idx_b“ der Tabelle „d1“. „t3“, TRX-ID 50AE, 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 32; aufsteigend 2;;
 1: Länge 4; Hex 80000001; aufsteigend ;;

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

Analysieren des Deadlock-Protokolls

*** (1) WARTEN AUF DIE GEWÄHRUNG DIESER SPERRE:
RECORD LOCKS Speicherplatz-ID 67 Seitennummer 3 n Bits 72 Index PRIMARY der Tabelle d1.t3 TRX-ID 50AF Sperrmodus X sperrt Datensatz, aber nicht Lückenwarte

Transaktion 2: Möchten Sie die X-Sperre des Primärschlüsselindex erhalten

*** (2) HÄLT DAS SCHLOSS:
RECORD LOCKS Speicherplatz-ID 67 Seitennummer 3 n Bits 72 Index PRIMARY der Tabelle d1.t3 TRX-ID 50AE Sperrmodus X sperrt Datensatz, aber nicht Lücke

Transaktion 1: hält eine X-Sperre auf dem Primärschlüsselindex

*** (2) WARTEN AUF DIE GEWÄHRUNG DIESER SPERRE:
Datensatzsperren Speicherplatz-ID 67 Seitennummer 5 n Bits 72 Index-IDx_b der Tabelle d1.t3 TRX-ID 50AE Sperrmodus X sperrt Datensatz, aber nicht Lückenwartezeit

Transaktion 1: Möchte die X-Sperre des gemeinsamen Index idx_b erhalten

Es entspricht exakt unserer Analyse und dem Online-Deadlock-Protokoll.

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:
  • Verstehen von MySQL-Deadlock-Routinen durch eindeutige Index-S-Sperre und X-Sperre
  • 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 verbergen und fälschen Sie die Versionsnummer in Nginx

>>:  Über Vue, um wiederholte Eingabeaufforderungen beim Aktualisieren der Seite nach Ablauf des Tokens zu vermeiden

Artikel empfehlen

Detaillierte Analyse der HTML-Semantik und der zugehörigen Front-End-Frameworks

Über Semantik Die Semantik ist die Lehre von der ...

So weisen Sie einer Instanz in Linux eine öffentliche IP-Adresse zu

beschreiben Beim Aufruf dieser Schnittstelle müss...

Verwenden Sie h1-, h2- und h3-Tags angemessen

Beim Erstellen von Webseiten ist die Verwendung d...

Warum der CSS-Attributwert clear:right im Detail nicht funktioniert

Die Verwendung der Clear-Eigenschaft zum Löschen v...

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

In diesem Artikel wird der dritte Artikel zur Ver...

Lernprogramm für HTML-Webseitenlisten-Tags

Lernprogramm zum Erlernen von Listen-Tags für HTML...

MySQL-Gruppe durch Gruppieren mehrerer Felder

Bei täglichen Entwicklungsaufgaben verwenden wir ...

Dockers Mechanismus zur Integritätserkennung

Für Container ist die einfachste Integritätsprüfu...

So stellen Sie über Navicat eine Remoteverbindung zu MySQL her

Wenn Sie Navicat direkt für die Verbindung über I...

Das neueste Installations-Tutorial für virtuelle Maschinen VMware 14

Zuerst gebe ich Ihnen den Aktivierungscode für VM...

Zusammenfassung der Erfahrungen mit der Verwendung des Div-Box-Modells

Berechnung des Boxmodells <br />Rand + Rahme...

CSS zum Erzielen des Effekts einer rotierenden Flip-Card-Animation

Die CSS-Animation des rotierenden Flip-Effekts, d...