Deadlock
Empfohlener Kurs: MySQL-Tutorial.
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!