2016-05-17 22 views
4

を超えて、私はsidekiq処理時間のかかるタスクを使用しますが、sidekiqにエラーを記録:のActiveRecord :: StatementInvalid:Mysql2 ::エラー:ロック待ちタイムアウトが私のレールプロジェクトで

ActiveRecord::StatementInvalid: Mysql2::Error: Lock wait timeout exceeded; try restarting transaction: UPDATE `marker_layers` SET `show_fields` = 'title,desc', `sort_col` = 'title,desc', `updated_at` = '2016-05-17 07:36:02' WHERE `marker_layers`.`id` = 16021210 
Processor: iZ23edse84Z:29310 

enter image description here sidekiq.yml

# Options here can still be overridden by cmd line args. 
# setsid sidekiq -d -C config/sidekiq.yml -e production 
--- 
:concurrency: 5 
:pidfile: tmp/pids/sidekiq.pid 
:logfile: log/sidekiq.log 
staging: 
    :concurrency: 10 
production: 
    :concurrency: 40 
:queues: 
    - ['critical', 3] 
    - ['default', 2] 
    - ['low', 1] 

database.ymlの

production: 
    adapter: mysql2 
    encoding: utf8mb4 
    collation: utf8mb4_bin 
    reconnect: false 
    database: database_name 
    pool: 48 
    username: password 
    password: password 
    host: locahost 
+2

ほとんどの場合、複数の従業員は同じデータベース行を更新しようとしますが、アクセスを待つ間はタイムアウトします。あなたの情報から、我々はもっと多くを伝えることはできません。競合状態のコードを再調査し、デッドロックがどこから来たのかを確認する必要があります。 – averell

+1

http://stackoverflow.com/questions/6000336/how-to-debug-lock-wait-timeout-exceeded役に立った –

答えて

0

このエラーは、異なるワーカーが同じリソースを変更しようとしているトランザクションタイムアウト(基本的にデータベースデッドロック)のために発生します。

明示的にSomeModel.transaction { SomeModel.task_that_takes_too_much_time }のようなトランザクションを使用している場合や、すべてがトランザクションにラップされているためレコードを変更する通常のActiveRecordメソッドを使用する場合に発生します。

私はあなたを与えることができる唯一の勧告はhttps://github.com/mhenrixon/sidekiq-unique-jobsを使用して.perform_inを使用するために、あなたの仕事をすることによって、あなたのような労働者ユニークを作るために選択肢を探ることです。

+0

私は多くのタスクを同時に処理するでしょう – scottxu

0

これは、データベースサイズが大きくなり、明示的に多くのトランザクションを実行している場合に発生します。おそらく、他のスレッドがレコードのロックを長時間保持していて、スレッドがタイムアウトしています。

私が使用した解決策の1つは、待機タイムアウトを延長することです。

端末からMySQLにログインし、これを実行してください。あなたが行うことができます

SET GLOBAL innodb_lock_wait_timeout = 28800; 

もう一つは、MySQLでロックされたテーブルのFORCEのUNLOCKである:このような

速報ロックはしばしばロックの原因となったSQL文には適用されないために、データベース内のアトミック性を引き起こします。

これはハックです。適切な解決策は、ロックを引き起こしたアプリケーションを修正することです。のは、営業上のレコードを意味

FORCE UNLOCK for locked tables in MySQL:

0

は別の遅いSQLによってロックされている、と長い時間を待っています。

多分、あなたのコードには長いトランザクションがたくさんあります。

コードをチェックし、遅いSQLを最適化し、長いトランザクションを分割します。

私はこれがあなたに役立つことを願っています。

+0

はい、しかし、私はそれを修正する方法がわかりません。 – scottxu

関連する問題