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

Docker-Kern und spezifische Verwendung der Installation

1. Was ist Docker? (1) Docker ist ein Open-Source...

Häufig verwendete JavaScript-Array-Methoden

Inhaltsverzeichnis 1. filter() 2. fürJedes() 3. e...

jQuery-Plugin zur Implementierung des Suchverlaufs

Jeden Tag ein jQuery-Plugin – um einen Suchverlau...

So verwenden Sie einen Docker-Container für den Zugriff auf das Host-Netzwerk

Vor Kurzem wurde ein System bereitgestellt, das n...

Vergleichende Analyse von IN und Exists in MySQL-Anweisungen

Hintergrund Als ich kürzlich SQL-Anweisungen schr...

Analysieren Sie den Unterschied zwischen berechnet und beobachtet in Vue

Inhaltsverzeichnis 1. Einführung in die Computert...

Detailliertes Beispiel zum Entfernen doppelter Daten in MySQL

Detailliertes Beispiel zum Entfernen doppelter Da...

Implementierung einer Bildfragmentierungsladefunktion basierend auf HTML-Code

Heute werden wir einen fragmentierten Bildladeeff...

Detaillierte Beschreibung von Shallow Copy und Deep Copy in js

Inhaltsverzeichnis 1. js-Speicher 2. Abtretung 3....

JavaScript Canvas implementiert die Bewegung des Balls entlang der Maus

In diesem Artikelbeispiel wird der spezifische Co...