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

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

藏色散人
藏色散人nach vorne
2023-04-13 16:32:371585Durchsuche

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

Die SQL-Anweisung lautet wie folgt:

update user_item set status=1 where user_id=? and item_id=?

Ursachenanalyse:

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

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

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=?
    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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:MySQL-Index, was bedeutet das?Nächster Artikel:MySQL-Index, was bedeutet das?