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.

19voto

Ahmad Sharif Punkte 3741
mysql->SHOW PROCESSLIST;
kill xxxx; 

und dann denjenigen im Schlaf töten. In meinem Fall ist es 2156.

enter image description here

12voto

James C Punkte 13821

100 % mit dem, was MarkR sagte. autocommit macht jede Anweisung eine Transaktion mit einer Anweisung.

SHOW ENGINE INNODB STATUS sollte Ihnen einige Hinweise auf den Grund der Blockierung geben. Schauen Sie sich auch Ihr langsames Abfrageprotokoll genau an, um zu sehen, was sonst noch die Tabelle abfragt, und versuchen Sie, alles zu entfernen, was einen vollständigen Tablescan durchführt. Sperren auf Zeilenebene funktioniert gut, aber nicht, wenn Sie versuchen, alle Zeilen zu sperren!

6voto

Mitesh Sharma Punkte 125

Versuchen Sie, die beiden folgenden Parameter zu aktualisieren, da sie Standardwerte haben müssen.

innodb_lock_wait_timeout = 50

innodb_rollback_on_timeout = ON

Zur Überprüfung der Parameterwerte können Sie die folgende SQL verwenden.

SHOW GLOBAL VARIABLES LIKE 'innodb_rollback_on_timeout';

5voto

John Kane Punkte 4340

Können Sie jeden anderen Datensatz in dieser Tabelle aktualisieren, oder wird diese Tabelle stark genutzt? Ich vermute, dass die eingestellte Zeitüberschreitung abgelaufen ist, während der Versuch unternommen wurde, eine Sperre zu erhalten, die für die Aktualisierung dieses Datensatzes erforderlich ist. Vielleicht können Sie die Zeit erhöhen, was helfen könnte.

5voto

Massimo212121 Punkte 167

In unserem Fall hatte das Problem nicht viel mit den Schlössern selbst zu tun.

Das Problem war, dass einer unserer Anwendungsendpunkte 2 Verbindungen parallel öffnen musste, um eine einzige Anfrage zu verarbeiten.

Beispiel:

  1. 1. Verbindung öffnen
  2. Start Transaktion 1
  3. 1 Zeile in Tabelle1 sperren
  4. 2. Verbindung öffnen
  5. Transaktion 2 starten
  6. 1 Zeile in Tabelle2 sperren
  7. Transaktion 2 festschreiben
  8. 2. Verbindung freigeben
  9. Commit-Transaktion 1
  10. 1. Verbindung freigeben

Unsere Anwendung hatte einen auf 10 Verbindungen begrenzten Verbindungspool.

Leider funktionierte die Anwendung unter Last nicht mehr, sobald alle Verbindungen genutzt wurden, und wir hatten dieses Problem. Wir hatten mehrere Anfragen, die eine zweite Verbindung öffnen mussten, um sie abzuschließen, was aber aufgrund der Begrenzung des Verbindungspools nicht möglich war. Infolgedessen hielten diese Anfragen eine Sperre für die Zeile table1 für eine lange Zeit, was dazu führte, dass die folgenden Anfragen, die dieselbe Zeile sperren mussten, diesen Fehler auslösten.

Lösung:

  • Auf kurze Sicht Wir haben das Problem behoben, indem wir das Limit für den Verbindungspool erhöht haben.
  • Auf lange Sicht haben wir alle verschachtelten Verbindungen entfernt, um das Problem vollständig zu lösen.

Tipps:

Sie können leicht überprüfen, ob Sie verschachtelte Verbindungen haben, indem Sie versuchen, das Limit Ihres Verbindungspools auf 1 zu senken und Ihre Anwendung zu testen.

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