Heim  >  Artikel  >  Datenbank  >  Unter welchen Umständen kommt es zu einem MySQL-Deadlock?

Unter welchen Umständen kommt es zu einem MySQL-Deadlock?

(*-*)浩
(*-*)浩Original
2019-05-08 11:07:063863Durchsuche

Deadlock bezieht sich auf das Phänomen, dass zwei oder mehr Prozesse aufgrund der Konkurrenz um Ressourcen während der Ausführung nicht weitermachen können. Das System befindet sich in einem Deadlock-Zustand oder das System hat einen Deadlock. Diese Prozesse, die ständig aufeinander warten, werden Deadlock-Prozesse genannt. Sperren auf Tabellenebene verursachen keine Deadlocks. Daher konzentriert sich die Lösung von Deadlocks hauptsächlich auf die am häufigsten verwendete InnoDB.

Empfohlener Kurs: MySQL-Tutorial.

Unter welchen Umständen kommt es zu einem MySQL-Deadlock?

Der Schlüssel zum Deadlock liegt darin, dass die Reihenfolge, in der zwei (oder mehr) Sitzungen gesperrt werden, inkonsistent ist.

Dann ist der entsprechende Schlüssel zur Lösung des Deadlock-Problems: Verschiedene Sitzungen der Reihe nach sperren

Fall

Anforderung: Das Geld anlegen, in mehrere Tranchen aufteilen und nach dem Zufallsprinzip an die Kreditnehmer verteilt.

Die ursprüngliche Idee des Geschäftsprozesses ist wie folgt:

Nachdem der Investor investiert hat, wird der Betrag nach dem Zufallsprinzip in mehrere Teile aufgeteilt, und dann werden einige davon nach dem Zufallsprinzip aufgeteilt Wird zufällig aus der Kreditnehmerliste ausgewählt. Verwenden Sie dann „Auswählen zum Aktualisieren“, um den Kontostand in der Kreditnehmertabelle usw. zu aktualisieren.

Wenn beispielsweise zwei Benutzer gleichzeitig investieren, wird der Betrag von Benutzer A zufällig in 2 Teile geteilt und an Kreditnehmer 1, 2 verteilt

Der Betrag von Benutzer B wird zufällig in 2 Teile aufgeteilt. Dem Kreditnehmer 2, 1 zugewiesen

Da die Reihenfolge der Sperrung unterschiedlich ist, wird es natürlich schnell zu einem Deadlock kommen.

Die Lösung dieses Problems ist sehr einfach: Sperren Sie einfach alle zugewiesenen Kreditnehmer auf einmal.

Wählen Sie * aus xxx, wobei die ID in (xx,xx,xx) zum Aktualisieren ist

Der Listenwert in MySQL wird automatisch von klein nach groß sortiert, fügen Sie The hinzu Schlösser sind auch eine Reihe von Schlössern von klein bis groß

 例如(以下会话id为主键):
 
Session1:
 
mysql> select * from t3 where id in (8,9) for update;
+----+--------+------+---------------------+
| id | course | name | ctime               |
+----+--------+------+---------------------+
|  8 | WA     | f    | 2016-03-02 11:36:30 |
|  9 | JX     | f    | 2016-03-01 11:36:30 |
+----+--------+------+---------------------+
rows in set (0.04 sec)
 
 
Session2:
select * from t3 where id in (10,8,5) for update;
锁等待中……
 
其实这个时候id=10这条记录没有被锁住的,但id=5的记录已经被锁住了,锁的等待在id=8的这里
不信请看
 
Session3:
mysql> select * from t3 where id=5 for update;
锁等待中
 
 
Session4:
mysql> select * from t3 where id=10 for update;
+----+--------+------+---------------------+
| id | course | name | ctime               |
+----+--------+------+---------------------+
| 10 | JB     | g    | 2016-03-10 11:45:05 |
+----+--------+------+---------------------+
row in set (0.00 sec)
 
 
在其它session中id=5是加不了锁的,但是id=10是可以加上锁的。

Das obige ist der detaillierte Inhalt vonUnter welchen Umständen kommt es zu einem MySQL-Deadlock?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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