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.

513voto

Eric Leschinski Punkte 134271

WIE FORCE UNLOCK für gesperrte Tabellen in MySQL:

Ein solches Aufbrechen von Schlössern kann dazu führen Atomarität in der Datenbank für die Sql-Anweisungen, die die Sperre verursacht haben, nicht erzwungen werden.

Die richtige Lösung ist, die Anwendung zu reparieren, die die Sperren verursacht hat. Wenn es jedoch um Geld geht, wird ein schneller Tritt die Dinge wieder in Gang bringen.

1) MySQL eingeben

mysql -u your_user -p

2) Sehen wir uns die Liste der gesperrten Tabellen an

mysql> show open tables where in_use>0;

3) Lassen Sie sich die Liste der laufenden Prozesse anzeigen, einer davon sperrt Ihre Tabelle(n)

mysql> show processlist;

4) Beenden Sie einen dieser Prozesse

mysql> kill <put_process_id_here>;

276voto

MarkR Punkte 60862

Sie verwenden eine Transaktion; autocommit deaktiviert Transaktionen nicht, sondern sorgt nur dafür, dass sie am Ende der Anweisung automatisch übertragen werden.

Es könnte sein, dass ein anderer Thread eine Datensatzsperre für einen Datensatz (Sie aktualisieren jeden Datensatz in der Tabelle!) zu lange hält und Ihr Thread in ein Timeout gerät. Oder es werden mehrere (2+) UPDATE-Abfragen auf dieselbe Zeile während einer einzigen Transaktion ausgeführt.

Sie können weitere Details des Ereignisses sehen, indem Sie eine

SHOW ENGINE INNODB STATUS

nach dem Ereignis (im SQL-Editor). Idealerweise sollten Sie dies auf einem ruhigen Testrechner tun.

154voto

veen Punkte 1457
mysql> set innodb_lock_wait_timeout=100;

Query OK, 0 rows affected (0.02 sec)

mysql> show variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 100   |
+--------------------------+-------+

Lösen Sie nun das Schloss erneut aus. Sie haben 100 Sekunden Zeit, um eine SHOW ENGINE INNODB STATUS\G auf die Datenbank zugreifen und sehen, welche andere Transaktion Ihre sperrt.

106voto

saisyukusanagi Punkte 931

Prüfen Sie, ob Ihre Datenbank optimal eingestellt ist. Insbesondere die Isolierung der Transaktionen. Es ist keine gute Idee, die Variable innodb_lock_wait_timeout zu erhöhen.

Überprüfen Sie die Isolationsebene Ihrer Datenbanktransaktion im mysql-cli:

mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation, @@session.tx_isolation;
+-----------------------+-----------------+------------------------+
| @@GLOBAL.tx_isolation | @@tx_isolation  | @@session.tx_isolation |
+-----------------------+-----------------+------------------------+
| REPEATABLE-READ       | REPEATABLE-READ | REPEATABLE-READ        |
+-----------------------+-----------------+------------------------+
1 row in set (0.00 sec)

Sie können Verbesserungen erzielen, indem Sie die Isolationsebene ändern, z.B. READ COMMITTED statt REPEATABLE READ (InnoDB Defaults) verwenden.

mysql> SET tx_isolation = 'READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL tx_isolation = 'READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)

mysql> 

Versuchen Sie auch, SELECT FOR UPDATE nur zu verwenden, wenn dies erforderlich ist.

49voto

BassMHL Punkte 7177

Irgendetwas blockiert die Ausführung der Abfrage. Höchstwahrscheinlich aktualisiert, fügt oder löscht eine andere Abfrage eine der Tabellen in Ihrer Abfrage. Sie müssen herausfinden, was das ist:

SHOW PROCESSLIST;

Sobald Sie den blockierenden Prozess gefunden haben, suchen Sie dessen id und laufen lassen:

KILL {id};

Führen Sie Ihre ursprüngliche Abfrage erneut durch.

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