2016-06-14 8 views
0

私は、この現在のアドレスオブジェクトがそのユーザーの下でアクティブな唯一のアドレスであることを保証するために実行するこのafter_saveメソッドを持っています。ActiveRecord :: StatementInvalid・Mysql2 ::エラー:ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再試行してみてください:

残念ながら、私は次のエラーを取得しています
before_save ensure_one_active_address 

def ensure_one_active_address 
    Address.where("active = ? AND user_id = ? AND id NOT IN (?)", active, user_id, id).update_all(active: 0) if active 
end 

ActiveRecord::StatementInvalid·Mysql2::Error: Deadlock found when trying to get lock; try restarting transaction

私はエラーを再現することができない、唯一の生産に起こります。エラーの意味を理解していますが、どこで発生しているのかわかりません。 whereクエリが終了する前にupdate_allが起きていますか?

答えて

0

このコールバックを実際に使用する場合は、after_saveの代わりにafter_commitを使用する必要があります。

+0

私はドキュメントで 'after_transaction'を見つけていません。私はあなたが 'after_commit'を参照していますか? 'after_save'は私がこのクエリを実行しているときに私がまだセーブトランザクション内にいるというヒントを得ていますか? – rmacias

+0

私はこれを見つけました。http://edgeguides.rubyonrails.org/active_record_callbacks.html#transaction-callbacks – rmacias

+0

'after_commit:sure_one_active_address'がトリックを行いました。ありがとう!! – rmacias

関連する問題