webentwicklung-frage-antwort-db.com.de

Laravel - Wartezeit für Sperren überschritten

Ich habe viele Transaktionen in meinem Code, und wenn bei der Ausführung einer dieser Transaktionen ein Fehler auftritt, der weder ein Commit noch ein Rollback auslöst, ist die Datenbank gesperrt, und alle nachfolgenden Versuche, auf die Datenbank zuzugreifen, führen zu folgendem Ergebnis:

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:

DB::beginTransaction();

try {
    //Code that uses exec() to process some images. <-- If code breaks here, then the above error appears on subsequent requests.
    //Code that accesses the database
}
catch(\Exception $e){
    DB::rollback();
    throw $e;
}
DB::commit();

Also auch PHP-Handwerker migrieren: Aktualisieren oder PHP-Handwerker migrieren: Reset funktioniert auch nicht mehr. Wie soll ich das beheben?

9
Andrew

Ich sehe doppelte Frage

Wie debuggen Sie das Wartezeitlimit für Sperrvorgänge auf MySQL?

Sie sollten in Betracht ziehen, das Zeitlimit für die Wartezeit beim Sperren für InnoDB zu erhöhen, indem Sie innodb_lock_wait_timeout festlegen. Der Standardwert ist 50 Sekunden

mysql> show variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50    |
+--------------------------+-------+
1 row in set (0.01 sec)

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

[mysqld]
innodb_lock_wait_timeout=120

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

SET GLOBAL innodb_lock_wait_timeout = 120`; 

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

SET innodb_lock_wait_timeout = 120; 
4
TinhNQ

Hier sind einige Tipps aus meiner Erfahrung ...

Wenn Sie eine testgetriebene Entwicklung durchführen, müssen Sie herausfinden, welche Testkombination den Fehler verursacht. Nutzen Sie den Mechanismus, den Ihr Ökosystem bietet, um Tests selektiv auszuführen (Beispiel: @group only für Testmethoden und phpunit --group only)

Reduzieren Sie als Nächstes das Wartezeitlimit für Sperren (SET GLOBAL innodb_lock_wait_timeout = 10). Auf diese Weise erhalten Sie schnelles Feedback und müssen nicht den ganzen Tag auf die Ausführung von Tests warten. Die Laufleistung kann variieren. Passen Sie Ihre 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 war nicht genug für die Logik und es wurde ein Fehler zwischen dem Beginn der Transaktion und dem Try-Catch-Rollback-Vorgang ausgegeben.

Erwägen Sie viertens, alle Teile der Transaktion in demselben Try-Catch zu platzieren, was einige Vorteile hat, wenn alle Teile vorhanden und leicht sichtbar sind. Beispiel:

    try {
        DB::beginTransaction();
        $this->someMethodThatMightThrow();
        DB::commit();
    } catch (Exception $e) {
        DB::rollBack();
        throw $e;
    }

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

3
Stoutie

Durch einen Neustart der Datenbank wurde dieses Problem behoben.

0
Dazzle

Dieses Problem hängt mit der MySQL-Datenbank zusammen. Ich war dem gleichen gegenübergestanden und habe es durch folgende Schritte erfolgreich gelöst. 

Suchen Sie nach der Datei usr/local/var/mysql/your_computer_name.local.err und erfahren Sie mehr über Fehler

Standort: /usr/local/var/mysql/ihr_computername.local.err

Es ist wahrscheinlich ein Problem mit Berechtigungen

  1. Finden Sie heraus, ob mysql ausgeführt wird, und beenden Sie es

ps -ef | grep mysql

töte -9 PID

dabei ist PID der zweite Spaltenwert 2. Überprüfen Sie den Besitz von Mysql

ls -laF/usr/local/var/mysql /

if it is owned by root, change it mysql or your user name



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

0
Amitesh