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.

4voto

Buttle Butkus Punkte 8846

Wenn Sie gerade eine große Abfrage beendet haben, wird es einige Zeit dauern, bis rollback . Wenn Sie eine weitere Abfrage durchführen, bevor die abgebrochene Abfrage zurückgesetzt wurde, kann ein Fehler wegen Zeitüberschreitung der Sperre auftreten. Genau das ist mir passiert. Die Lösung war, einfach ein bisschen zu warten.

Einzelheiten:

Ich hatte eine DELETE-Abfrage gestellt, um etwa 900.000 von etwa 1 Million Zeilen zu entfernen.

Ich habe dies versehentlich durchgeführt (nur 10 % der Zeilen wurden entfernt): DELETE FROM table WHERE MOD(id,10) = 0

Stattdessen (90% der Zeilen werden entfernt): DELETE FROM table WHERE MOD(id,10) != 0

Ich wollte 90 % der Zeilen entfernen, nicht 10 %. Also beendete ich den Prozess in der MySQL-Befehlszeile, wohl wissend, dass er alle bis dahin gelöschten Zeilen zurücknehmen würde.

Dann führte ich sofort den richtigen Befehl aus und erhielt eine lock timeout exceeded Fehler bald darauf. Mir wurde klar, dass die Sperre in Wirklichkeit die rollback der getöteten Abfrage noch im Hintergrund abläuft. Also wartete ich ein paar Sekunden und führte die Abfrage erneut aus.

2voto

gladiator Punkte 714

Die Anzahl der Zeilen ist nicht groß... Erstellen Sie einen Index auf account_import_id, wenn es nicht der Primärschlüssel ist.

CREATE INDEX idx_customer_account_import_id ON customer (account_import_id);

1voto

Ravi Chhatrala Punkte 324

Stellen Sie sicher, dass die Datenbanktabellen die InnoDB-Speicher-Engine und die Transaktionsisolationsebene READ-COMMITTED verwenden.

Sie können dies mit SELECT @@GLOBAL.tx_isolation, @@tx_isolation; auf der mysql-Konsole überprüfen.

Wenn sie nicht auf READ-COMMITTED eingestellt ist, müssen Sie sie einstellen. Vergewissern Sie sich vor dem Einstellen, dass Sie über SUPER-Rechte in mysql verfügen.

Sie können Hilfe in Anspruch nehmen von http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html .

Ich denke, dass damit Ihr Problem gelöst wird.


Sie sollten auch sicherstellen, dass Sie nicht versuchen, diese in zwei Prozessen gleichzeitig zu aktualisieren. Benutzer ( @tala ) haben in diesem Zusammenhang ähnliche Fehlermeldungen erhalten, vielleicht sollten Sie das überprüfen...

1voto

Kamae Punkte 535

Ich komme von Google und wollte nur die Lösung hinzufügen, die bei mir funktioniert hat. Mein Problem war, dass ich versuchte, Datensätze aus einer riesigen Tabelle zu löschen, die eine Menge FK in Kaskade hatte, so dass ich den gleichen Fehler wie der OP bekam.

Ich habe die autocommit und dann funktionierte es, indem man einfach COMMIT am Ende des SQL-Satzes. Soweit ich verstanden habe, wird dadurch der Puffer nach und nach freigegeben, anstatt am Ende des Befehls zu warten.

Um bei dem Beispiel aus dem OP zu bleiben, hätte dies funktionieren müssen:

mysql> set autocommit=0;

mysql> update customer set account_import_id = 1; commit;

Vergessen Sie nicht die Reaktivierung der autocommit erneut, wenn Sie die MySQL-Konfiguration so belassen wollen wie bisher.

mysql> set autocommit=1;

0voto

Satish Kumar Punkte 113

Ich habe ein ähnliches Problem, als ich einige Tests durchgeführt habe.

Grund - In meinem Fall wurde die Transaktion nicht von meiner Spring-Boot-Anwendung übertragen, weil ich die @transactional-Funktion während der Ausführung beendet habe (als die Funktion einige Zeilen aktualisierte). Aus diesem Grund wurde die Transaktion nie in die Datenbank (MySQL) übertragen.

Ergebnis - nicht in der Lage, diese Zeilen von irgendwoher zu aktualisieren. Andere Zeilen der Tabelle können jedoch aktualisiert werden.

mysql> update some_table set some_value = "Hello World" where id = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

Lösung - alle MySQL-Prozesse mit

  • sudo killall -9 mysqld

enter image description here

  • sudo killall -9 mysqld_safe (startet den Server neu, wenn ein Fehler auftritt und protokolliert Laufzeitinformationen in einem Fehlerprotokoll. In meinem Fall nicht erforderlich)

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