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?
Ich sehe doppelte Frage
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%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.
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
ps -ef | grep mysql
kill -9 PID
wobei PID der zweite Spaltenwert ist 2. Überprüfen Sie den Besitz von mysql
%Vor%ls-laF / usr / lokal / var / mysql /
sudo chown -R mysql / usr / local / var / mysql /
Tags und Links php mysql laravel transactions