Laravel - Zeitüberschreitung beim Warten auf Sperren überschritten

8

Ich habe eine Menge Transaktionen in meinem Code, und wenn ein Fehler bei der Ausführung in einer dieser Transaktionen auftritt, der kein Commit oder Rollback auslöst, wird die Datenbank gesperrt und alle nachfolgenden Versuche, auf die Datenbank zuzugreifen, führen dazu :

production.ERROR: PDOException: SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction in /home/forge/default/vendor/laravel/framework/src/Illuminate/Database/Connection.php:390

Im Controller:

%Vor%

Also sogar php artisan migrieren: aktualisieren oder php artisan migrieren: reset funktioniert auch nicht mehr. Wie soll ich das beheben?

    
Andrew 10.08.2016, 07:14
quelle

3 Antworten

3

Ich sehe doppelte Frage

Wie debuggt das Sperrwartezeitlimit für MySQL überschritten?

Sie sollten in Erwägung ziehen, den Zeitüberschreitungswert für die Sperrwartezeit für InnoDB zu erhöhen, indem Sie innodb_lock_wait_timeout festlegen. Der Standardwert ist 50 sec.

%Vor%

Sie können den Wert in /etc/my.cnf mit dieser Zeile dauerhaft auf einen höheren Wert setzen

%Vor%

und mysql neu starten. Wenn Sie MySQL zu diesem Zeitpunkt nicht neu starten können, führen Sie Folgendes aus:

%Vor%

Sie können es auch für die Dauer Ihrer Sitzung festlegen

%Vor%     
TinhNQ 10.08.2016 07:31
quelle
1

Hier sind ein paar Tipps aus meiner Erfahrung ...

Wenn Sie eine testgesteuerte Entwicklung durchführen, isolieren Sie, welche Kombination von Tests den Fehler verursacht. Nutzen Sie den von Ihrem Ökosystem bereitgestellten Mechanismus, um Tests selektiv auszuführen (Beispiel: @group only bei Testmethoden und phpunit --group only )

Reduzieren Sie als Nächstes das Wartezeitlimit für die Sperre ( SET GLOBAL innodb_lock_wait_timeout = 10 ). Auf diese Weise erhalten Sie eine schnelle Rückmeldung und verbringen nicht den ganzen Tag damit, auf Tests zu warten. Die Laufleistung kann variieren. Passen Sie sich Ihren spezifischen Bedingungen an.

Suchen Sie drittens nach nicht abgeschlossenen Transaktionen, dh beginnen Sie ohne Rollback oder Commit. Dies stellte sich als genau das heraus, was mein Problem war. Mein try / catch wickelte nicht genug Logik auf und es kam zu einem Fehler zwischen begin transaction und try-catch-rollback.

Viertens sollten Sie überlegen, alle Transaktionsteile in denselben try-catch zu legen, was einige Vorteile hat, wenn Sie sicherstellen, dass alle Teile vorhanden und gut sichtbar sind. Beispiel:

%Vor%

Das sind meine zwei Cent. Hoffentlich nützlich für jemanden im Internet.

    
Stoutie 13.02.2017 23:37
quelle
0

Dieses Problem hängt mit der MySQL-Datenbank zusammen. Ich hatte das gleiche erlebt und durch folgende Schritte erfolgreich gelöst.

Finden Sie die Datei usr / local / var / mysql / Ihr_Computername.local.err und verstehen Sie mehr Informationen über den Fehler

Ort: /usr/local/var/mysql/ihr_computer_name.local.err

Es ist wahrscheinlich ein Problem mit den Berechtigungen

  1. Finde heraus, ob mysql läuft und kill es
  

ps -ef | grep mysql

     

kill -9 PID

wobei PID der zweite Spaltenwert ist  2. Überprüfen Sie den Besitz von mysql

  

ls-laF / usr / lokal / var / mysql /

%Vor%
  

sudo chown -R mysql / usr / local / var / mysql /

    
user2745436 11.05.2017 11:43
quelle

Tags und Links