Heim > Datenbank > MySQL-Tutorial > Hauptteil

Ein Artikel, der ausführlich erklärt, wie MySQL Deadlocks stapelweise aktualisiert

藏色散人
Freigeben: 2023-04-13 16:32:37
nach vorne
1586 Leute haben es durchsucht

Dieser Artikel vermittelt Ihnen relevantes Wissen über MySQL. Es geht hauptsächlich darum, wie MySQL Deadlocks stapelweise aktualisiert. Ich hoffe, dass es für alle hilfreich ist.

Ein Artikel, der ausführlich erklärt, wie MySQL Deadlocks stapelweise aktualisiert

Die Tabellenstruktur ist wie folgt:

CREATE TABLE `user_item` (
  `id` BIGINT(20) NOT NULL,
  `user_id` BIGINT(20) NOT NULL,
  `item_id` BIGINT(20) NOT NULL,
  `status` TINYINT(4) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_1` (`user_id`,`item_id`,`status`)) ENGINE=INNODB DEFAULT CHARSET=utf-8
Nach dem Login kopieren

Die SQL-Anweisung lautet wie folgt:

update user_item set status=1 where user_id=? and item_id=?
Nach dem Login kopieren

Ursachenanalyse:

 mysql的事务支持与存储引擎有关,MyISAM不支持事务,INNODB支持事务,更新时采用的是行级锁。这里采用的是INNODB做存储引擎,意味着会将update语句做为一个事务来处理。前面提到行级锁必须建立在索引的基础,这条更新语句用到了索引idx_1,所以这里肯定会加上行级锁。

 行级锁并不是直接锁记录,而是锁索引,如果一条SQL语句用到了主键索引,mysql会锁住主键索引;如果一条语句操作了非主键索引,mysql会先锁住非主键索引,再锁定主键索引。
Nach dem Login kopieren

Diese Update-Anweisung führt die folgenden Schritte aus:

  1. Da es sich um einen Nicht-Primärschlüssel handelt Wenn der Index verwendet wird, müssen Sie zuerst idx_1 abrufen. Die Sperre auf Zeilenebene

  2. wird dann basierend auf dem Primärschlüssel aktualisiert. Daher ist es erforderlich, die Sperre auf Zeilenebene für den Primärschlüssel abzurufen

  3. Danach Wenn das Update abgeschlossen ist, schreiben Sie alle Sperren fest und geben Sie sie frei.

Wenn zwischen Schritt 1 und 2 plötzlich eine Anweisung eingefügt wird: update user_item…..wo id=? und user_id=?, sperrt diese Anweisung zuerst den Primärschlüsselindex und dann idx_1.

Eine Anweisung erwirbt die Sperre für idx_1 und wartet auf die Sperre für den Primärschlüsselindex; eine andere Anweisung erwirbt die Sperre für den Primärschlüssel und wartet auf die Sperre für idx_1, wodurch ein Deadlock entsteht.

Lösung:

  1. Zuerst den Primärschlüssel des Datensatzes abrufen, der aktualisiert werden muss
  2. Aktualisieren Sie
    select id from user_item where user_id=? and item_id=?
    Nach dem Login kopieren
    nacheinander
  3. Wiederholen Sie den ersten und zweiten Schritt in einem Batch-Zyklus

Empfohlenes Lernen: „ MySQL-Video-Tutorial

Das obige ist der detaillierte Inhalt vonEin Artikel, der ausführlich erklärt, wie MySQL Deadlocks stapelweise aktualisiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage