Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL Deadlock mit einer Einfügung, die einen Trigger auslöst

Thread 2 hält eine gemeinsame Sperre für die Zeile in der Benutzertabelle.

Dann versucht Thread 1, eine exklusive Sperre für dieselbe Zeile zu erhalten, und geht in den Lock-Wait-Modus.

Aber Thread 1 hat keine Gelegenheit für eine Zeitüberschreitung, da Thread 2 dann versucht, seine Sperre auf exklusiv zu eskalieren ... aber um das zu tun, muss er auf Thread 1 warten, der sich in Lock Wait befindet, aber auf ihn wartet Thread 2.

Sie blockieren sich gegenseitig.

Das ist eine Sackgasse.

Der Server wählt eine Transaktion zum Abbrechen aus, damit sie sich nicht gegenseitig unnötig blockieren.

Die Deadlock-Erkennung ermöglicht es einem Thread, auf Kosten des anderen sofort erfolgreich zu sein. Andernfalls würden sie beide in der Sperre stecken und warten, bis einer von ihnen an zu langem Warten gestorben ist.

Sie befinden sich im Autocommit-Modus, aber das bedeutet natürlich nicht, dass Sie sich nicht in einer Transaktion befinden. Jede Abfrage mit InnoDB wird immer noch in einer Transaktion behandelt, aber mit Autocommit wird die Transaktion implizit gestartet, wenn die Abfrage ausgeführt wird, und implizit festgeschrieben, wenn sie erfolgreich ist.