439 Stimmen

Die Meldung "Lock wait timeout exceeded; try restarting transaction" wird angezeigt, obwohl ich keine Transaktion verwende.

Ich verwende das folgende MySQL UPDATE Erklärung:

mysql> update customer set account_import_id = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

Ich verwende keine Transaktion, warum sollte ich also diesen Fehler erhalten? Ich habe sogar versucht, meinen MySQL-Server neu zu starten, aber das hat nicht geholfen.

Die Tabelle hat 406.733 Zeilen.

0voto

Ich hatte einen ähnlichen Fehler, als ich mit Python auf eine mysql-Datenbank zugriff.
Das Python-Programm verwendete eine while- und for-Schleife.
Schließen des Cursors und Verknüpfung in der entsprechenden Zeile löste das Problem
https://github.com/nishishailesh/sensa_host_com/blob/master/sensa_write.py siehe Zeile 230
Es scheint, dass die Aufforderung, den Link zu wiederholen, ohne den vorherigen Link zu schließen, zu diesem Fehler führt

0voto

Sal Punkte 301

Wir sind gestern auf dieses Problem gestoßen, und nachdem wir so ziemlich alle hier vorgeschlagenen Lösungen und einige andere aus anderen Antworten/Foren durchgespielt hatten, konnten wir das Problem lösen, nachdem wir das eigentliche Problem erkannt hatten.

Aufgrund einer schlechten Planung war unsere Datenbank auf einem gemounteten Volume gespeichert, das auch unsere regelmäßigen automatischen Backups empfing. Dieses Volume hatte seine maximale Kapazität erreicht.

Nachdem wir etwas Platz freigemacht und neu gestartet hatten, war der Fehler behoben.

Beachten Sie, dass wir einige der Prozesse auch manuell beendet haben: kill <process_id>; Das kann also noch notwendig sein.

Insgesamt haben wir festgestellt, dass es unglaublich frustrierend war, dass in keinem unserer Protokolle oder Warnungen direkt ein Mangel an Festplattenplatz erwähnt wurde, aber das schien die Hauptursache zu sein.

0voto

fabpico Punkte 2025

Ich lief in diese mit 2 Doctrine DBAL-Verbindungen, eine von denen als nicht-transaktionale (für wichtige Protokolle), sie sollen parallel laufen nicht abhängig von einander.

CodeExecution(
    TransactionConnectionQuery()
    TransactionlessConnectionQuery()
)

Meine Integrationstests wurden in Transaktionen für Daten-Rollback nach sehr Test verpackt.

beginTransaction()
CodeExecution(
    TransactionConnectionQuery()
    TransactionlessConnectionQuery() // CONFLICT
)
rollBack()

Meine Lösung war, die Wrapping-Transaktion in diesen Tests zu deaktivieren und die Datenbankdaten auf eine andere Weise zurückzusetzen.

0voto

Jeff Luyet Punkte 346

In meinem Fall führte ich eine anormale Abfrage aus, um Daten zu korrigieren. Wenn Sie die Tabellen in Ihrer Abfrage sperren, müssen Sie sich nicht mit dem Lock-Timeout befassen:

LOCK TABLES `customer` WRITE;
update customer set account_import_id = 1;
UNLOCK TABLES;

Für den normalen Gebrauch ist dies wahrscheinlich keine gute Idee.

Für weitere Informationen siehe: MySQL 8.0 Referenzhandbuch

0voto

TomoMiha Punkte 1006

So etwas ist mir passiert, als ich php verwendet habe Sprachkonstrukt exit; in der Mitte der Transaktion. Dann wird diese Transaktion "hängt" und man muss den mysql-Prozess beenden (wie oben mit processlist; beschrieben)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X