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.
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:
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
wird dann basierend auf dem Primärschlüssel aktualisiert. Daher ist es erforderlich, die Sperre auf Zeilenebene für den Primärschlüssel abzurufen
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:
select id from user_item where user_id=? and item_id=?nacheinander
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!