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. 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 Die detaillierten Änderungen des Sperrstatus sind wie folgt
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. 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:
|
>>: Detaillierte Erklärung der grundlegenden Verwendung der Hilfsfunktion MapGetters in Vuex
Einführung Das Docker-Compose-Projekt ist ein off...
Eine kurze Beschreibung der Umgebungsvariablenkon...
In diesem Artikel wird der spezifische Code von V...
Ich habe heute einen neuen Trick gelernt. Ich kann...
Die lokale Umgebung ist Windows 10 + WSL2 (Ubuntu...
1. Übersicht über SQLException Wenn bei der Verwe...
In diesem Artikelbeispiel wird der spezifische Co...
1. Installieren Sie Oracle. Im Internet gibt es z...
Dieser Artikel fasst gängige Betriebstechniken fü...
1. Versuchen Sie, ein einspaltiges statt eines meh...
Inhaltsverzeichnis 1. Analyse der MySQL-Architekt...
Vorwort In diesem Artikel wird hauptsächlich erlä...
Laden Sie zuerst die neueste komprimierte MySQL 5...
Installieren Sie TomCat unter Windows Dieser Arti...
Hexo bindet einen benutzerdefinierten Domänenname...