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

wie vermeidet man Deadlocks in mysql

Nach meinem Verständnis erwirbt ein Select keine Sperre und sollte nicht die Ursache für den Deadlock sein.

Jedes Mal, wenn Sie eine Zeile einfügen/aktualisieren/löschen, wird eine Sperre erworben. Um Deadlocks zu vermeiden, müssen Sie dann sicherstellen, dass gleichzeitige Transaktionen keine Zeile in einer Reihenfolge aktualisieren, die zu einem Deadlock führen könnte. Allgemein gesagt, um Deadlocks zu vermeiden, müssen Sie Sperren immer in der gleichen Reihenfolge erwerben auch in unterschiedlichen Transaktionen (z.B. immer zuerst Tabelle A, dann Tabelle B).

Wenn Sie jedoch innerhalb einer Transaktion nur in eine Tabelle einfügen, ist diese Bedingung erfüllt, was in der Regel nicht zu einem Deadlock führen sollte. Machen Sie bei der Transaktion noch etwas anderes?

Ein Deadlock kann jedoch auftreten, wenn Indexe fehlen . Wenn eine Zeile eingefügt/aktualisiert/gelöscht wird, muss die Datenbank die relationalen Einschränkungen überprüfen, d. h. sicherstellen, dass die Beziehungen konsistent sind. Dazu muss die Datenbank die Fremdschlüssel in den zugehörigen Tabellen prüfen. Es vielleicht dazu führen, dass eine andere Sperre als die geänderte Zeile erworben wird. Stellen Sie dann sicher, dass Sie immer einen Index auf den Fremdschlüsseln (und natürlich den Primärschlüsseln) haben, da dies sonst zu einer Tabellensperre führen könnte anstelle einer Zeilensperre . Wenn eine Tabellensperre auftritt, ist der Sperrkonflikt höher und die Wahrscheinlichkeit eines Deadlocks steigt.

Nicht sicher, was genau in Ihrem Fall passiert, aber vielleicht hilft es.