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
Über Semantik Die Semantik ist die Lehre von der ...
Erneutes Mounten des Datenträgers nach dem Initia...
Beim Anwenden von Docker-Containern mounten wir h...
beschreiben Beim Aufruf dieser Schnittstelle müss...
Beim Erstellen von Webseiten ist die Verwendung d...
Die Verwendung der Clear-Eigenschaft zum Löschen v...
In diesem Artikel wird der dritte Artikel zur Ver...
Lernprogramm zum Erlernen von Listen-Tags für HTML...
Bei täglichen Entwicklungsaufgaben verwenden wir ...
Für Container ist die einfachste Integritätsprüfu...
Wenn Sie Navicat direkt für die Verbindung über I...
Zuerst gebe ich Ihnen den Aktivierungscode für VM...
Berechnung des Boxmodells <br />Rand + Rahme...
Code kopieren Der Code lautet wie folgt: <span...
Die CSS-Animation des rotierenden Flip-Effekts, d...