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:
| ||||||||||||
Die zweite Aussage |
---|
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.
<<: So verbergen und fälschen Sie die Versionsnummer in Nginx
1. Was ist Docker? (1) Docker ist ein Open-Source...
Inhaltsverzeichnis 1. filter() 2. fürJedes() 3. e...
Jeden Tag ein jQuery-Plugin – um einen Suchverlau...
Um das Problem zu lösen, dass Deepin den Google C...
Vor Kurzem wurde ein System bereitgestellt, das n...
Rand: automatisch; + Position: absolut; oben, unt...
Hintergrund Als ich kürzlich SQL-Anweisungen schr...
Inhaltsverzeichnis 1. Einführung in die Computert...
Detailliertes Beispiel zum Entfernen doppelter Da...
Heute werden wir einen fragmentierten Bildladeeff...
Inhaltsverzeichnis 1. js-Speicher 2. Abtretung 3....
In diesem Artikelbeispiel wird der spezifische Co...
Problembeschreibung Ich habe drei virtuelle Masch...
Dieser Artikel beschreibt anhand eines Beispiels ...
Hintergrund Alle Server des Unternehmens sind gek...