コードに多数のトランザクションがあり、これらのトランザクションのいずれかで実行中にコミットまたはロールバックをトリガーしないエラーが発生した場合、データベースはロックされ、その後データベースにアクセスしようとすると、次のようになります。
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も機能しなくなります。これを修正するにはどうすればよいですか?
重複する質問が表示されます
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;
ここに私の経験からいくつかのヒントがあります...
テスト駆動開発を行っている場合は、テストのどの組み合わせでエラーが発生するかを特定します。エコシステムが提供するメカニズムを利用して、テストを選択的に実行します(例:@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セントです。うまくいけば、インターネット上の誰かにとって有用です。
データベースを再起動すると、この問題は解決しました。
この問題は、mysqlデータベースに関連しています。私は同じことに直面し、次の手順でそれを首尾よく解決しました。
Usr/local/var/mysql/your_computer_name.local.errファイルを見つけて、エラーに関する詳細情報を理解します
場所:/usr/local/var/mysql/your_computer_name.local.err
おそらく権限に問題があります
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 /