web-dev-qa-db-ja.com

Laravel-ロック待機タイムアウトを超えました

コードに多数のトランザクションがあり、これらのトランザクションのいずれかで実行中にコミットまたはロールバックをトリガーしないエラーが発生した場合、データベースはロックされ、その後データベースにアクセスしようとすると、次のようになります。

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

コントローラで:

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();

したがって、php artisan migrate:refreshやphp artisan migrate:resetも機能しなくなります。これを修正するにはどうすればよいですか?

13
Snowball

重複する質問が表示されます

MySQLでロック待機タイムアウトを超えた場合のデバッグ方法

Innodb_lock_wait_timeoutを設定して、InnoDBのロック待機タイムアウト値を増やすことを検討する必要があります。デフォルトは50秒です。

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

この行を使用して、/ etc/my.cnfでより高い値に永続的に設定できます。

[mysqld]
innodb_lock_wait_timeout=120

mysqlを再起動します。この時点でmysqlを再起動できない場合は、次を実行します。

SET GLOBAL innodb_lock_wait_timeout = 120`; 

セッション中に設定することもできます

SET innodb_lock_wait_timeout = 120; 
6

ここに私の経験からいくつかのヒントがあります...

テスト駆動開発を行っている場合は、テストのどの組み合わせでエラーが発生するかを特定します。エコシステムが提供するメカニズムを利用して、テストを選択的に実行します(例:@group onlyテスト方法とphpunit --group only

次に、ロック待機タイムアウト(SET GLOBAL innodb_lock_wait_timeout = 10)。このようにすれば、迅速なフィードバックを得ることができ、テストの実行を待つのに1日を費やす必要がなくなります。走行距離は異なる場合があります。特定の条件に調整します。

3番目に、閉じられていないトランザクションを探します。つまり、ロールバックやコミットなしで開始します。これがまさに私の問題でした。私のtry/catchは十分なロジックをラップしておらず、トランザクションの開始とtry-catch-rollbackの間でエラーが発生していました。

4番目に、トランザクションのすべての部分を同じtry-catchに配置することを検討してください。これには、すべての部分が存在し、簡単に見えるようにするという利点があります。例:

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

それは私の2セントです。うまくいけば、インターネット上の誰かにとって有用です。

4
Stoutie

データベースを再起動すると、この問題は解決しました。

0
Dazzle

この問題は、mysqlデータベースに関連しています。私は同じことに直面し、次の手順でそれを首尾よく解決しました。

Usr/local/var/mysql/your_computer_name.local.errファイルを見つけて、エラーに関する詳細情報を理解します

場所:/usr/local/var/mysql/your_computer_name.local.err

おそらく権限に問題があります

  1. Mysqlが実行されているかどうかを確認して強制終了する

ps -ef | grep mysql

キル-9 PID

ここで、PIDは2番目の列の値です2. 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