Vorwort Das Wesen eines Deadlocks ist Ressourcenwettbewerb. Wenn die Reihenfolge der Batcheinfügung inkonsistent ist, kann dies leicht zu einem Deadlock führen. Lassen Sie uns diese Situation analysieren. Zur Vereinfachung der Demonstration wird das Batch-Einfügen als mehrere Einfügungen neu geschrieben. Machen wir zunächst ein paar kleine Experimente. Die vereinfachte Tabellenstruktur sieht wie folgt aus TABELLE ERSTELLEN `t1` ( `id` int(11) NICHT NULL AUTO_INCREMENT, `ein` varchar(5), `b` varchar(5), Primärschlüssel (`id`), EINDEUTIGER SCHLÜSSEL `uk_name` (`a`,`b`) ); Versuch 1: Wenn zwei Batch-Einfügungen derselben Reihenfolge gleichzeitig ausgeführt werden und der Datensatz nicht vorhanden ist, wechselt der zweite in den Sperrwartezustand.
Sie können den aktuellen Sperrstatus sehen mysql> wähle * aus information_schema.innodb_locks; +-------------+----------+-----------+---------------+-------------+------------+------------+------------+-----------+-----------+-----------+ | Sperr-ID | Sperr-TRX-ID | Sperrmodus | Sperrtyp | Sperrtabelle | Sperrindex | Sperrbereich | Sperrseite | Sperraufzeichnung | Sperrdaten | +-------------+----------+-----------+---------------+-------------+------------+------------+------------+-----------+-----------+-----------+ | 31AE:54:4:2 | 31AE | S | AUFZEICHNUNG | `d1`.`t1` | `uk_name` | 54 | 4 | 2 | '1', '1' | | 31AD:54:4:2 | 31AD | X | AUFZEICHNUNG | `d1`.`t1` | `uk_name` | 54 | 4 | 2 | '1', '1' | +-------------+----------+-----------+---------------+-------------+------------+------------+------------+-----------+-----------+-----------+ Wenn wir den Einfügevorgang der Transaktion t1 ausführen, werden keine Sperrhaltepunkte angezeigt. Dies hängt mit dem Prinzip des MySQL-Einfügevorgangs zusammen.
Beim Einfügen von Datensätzen zum Zeitpunkt t1 werden keine Sperren angewendet. Zu diesem Zeitpunkt wurde die Transaktion t1 noch nicht festgeschrieben. Wenn die Transaktion t2 versucht, etwas einzufügen, findet sie diesen Datensatz. t2 versucht, die S-Sperre zu erhalten und ermittelt, ob die Transaktions-ID im Datensatz aktiv ist. Wenn sie aktiv ist, bedeutet dies, dass die Transaktion nicht beendet wurde. Dies hilft t1 dabei, seine implizite Sperre in eine explizite Sperre (X-Sperre) zu aktualisieren. Der Quellcode lautet wie folgt t2 Ergebnis des Erwerbs der S-Sperre: DB_LOCK_WAIT Versuch 2: Deadlock aufgrund inkonsistenter Batch-Einfügereihenfolge
------------------------ Zuletzt erkannter Deadlock ------------------------ 181101 9:48:36 *** (1) TRANSAKTION: TRANSAKTION 3309, AKTIV 215 Sek. Einfügen MySQL-Tabellen in Verwendung 1, gesperrt 1 LOCK WAIT 3 Sperrstruktur(en), Heap-Größe 376, 2 Zeilensperre(n), Undo-Log-Einträge 2 MySQL-Thread-ID 2, OS-Thread-Handle 0x70000a845000, Abfrage-ID 58, Localhost-Root-Update einfügen in t1(a, b)values("2", "2") *** (1) WARTEN AUF DIE GEWÄHRUNG DIESER SPERRE: Datensatzsperren, Bereichs-ID 55, Seitennummer 4, n Bits 72, Index „uk_name“ der Tabelle „d1“. „t1“ TRX-ID 3309, Sperrmodus S, wartend Datensatzsperre, Heap Nr. 3 PHYSIKALISCHER DATENSATZ: n_Felder 3; kompaktes Format; Infobits 0 0: Länge 1; Hex 32; aufsteigend 2;; 1: Länge 1; Hex 32; aufsteigend 2;; 2: Länge 4; Hex 80000002; aufsteigend ;; *** (2) TRANSAKTION: TRANSAKTION 330A, AKTIV 163 Sek. Einfügen MySQL-Tabellen in Verwendung 1, gesperrt 1 3 Sperrstruktur(en), Heap-Größe 376, 2 Zeilensperre(n), Undo-Log-Einträge 2 MySQL-Thread-ID 3, OS-Thread-Handle 0x70000a888000, Abfrage-ID 59, Localhost-Root-Update einfügen in t1(a, b)values("1", "1") *** (2) HÄLT DAS SCHLOSS: Datensatzsperren, Speicherplatz-ID 55, Seitennummer 4, n Bits 72, Index „uk_name“ der Tabelle „d1“. „t1“, TRX-ID 330A, Sperrmodus X sperrt Datensatz, aber nicht Lücke Datensatzsperre, Heap Nr. 3 PHYSIKALISCHER DATENSATZ: n_Felder 3; kompaktes Format; Infobits 0 0: Länge 1; Hex 32; aufsteigend 2;; 1: Länge 1; Hex 32; aufsteigend 2;; 2: Länge 4; Hex 80000002; aufsteigend ;; *** (2) WARTEN AUF DIE GEWÄHRUNG DIESER SPERRE: Datensatzsperren, Bereichs-ID 55, Seitennummer 4, n Bits 72, Index „uk_name“ der Tabelle „d1“. „t1“, TRX-ID 330A, Sperrmodus S, wartend Datensatzsperre, Heap Nr. 2 PHYSIKALISCHER DATENSATZ: n_Felder 3; kompaktes Format; Infobits 0 0: Länge 1; Hex 31; aufsteigend 1;; 1: Länge 1; Hex 31; aufsteigend 1;; 2: Länge 4; Hex 80000001; aufsteigend ;; *** WIR MACHEN DIE TRANSAKTION ZURÜCK (2) Wie kann man ein solches Problem lösen? Eine mögliche Lösung besteht darin, die Daten nach der Sortierung auf der Anwendungsebene einzufügen. Zusammenfassen Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Das könnte Sie auch interessieren:
|
<<: Der vollständige Code der im Uniapp-Applet enthaltenen Radardiagrammkomponente
Linux: Linux-Version 3.10.0-123.9.3.el7.x86_64 Ng...
Klicken Sie mit JavaScript, um die Form des Bilde...
Frage: Nach dem Neustart des Computers kann der M...
Die Standardportnummer des Remotedesktops des Win...
Inhaltsverzeichnis 1. Einfach zu lesender Code 1....
Vorwort Dieser Artikel fasst hauptsächlich einige...
Vorwort: Die verteilte Master-Slave-Architektur v...
<br />Verwandte Artikel: 9 praktische Vorsch...
1. Installation Suchen Sie über DockerHub nach de...
Wenn der vorhandene Videoplayer die Anforderungen...
Allgemeine Kommentare in HTML: <!--XXXXXXXX--&g...
Inhaltsverzeichnis Vorwort Deskriptoren Detaillie...
Ich habe gestern gerade etwas HTML gelernt und kon...
Inhaltsverzeichnis 1. Problemhintergrund 2. Welch...
// Ich habe einen ganzen Nachmittag für die Insta...