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が起きていますか?
私はドキュメントで 'after_transaction'を見つけていません。私はあなたが 'after_commit'を参照していますか? 'after_save'は私がこのクエリを実行しているときに私がまだセーブトランザクション内にいるというヒントを得ていますか? – rmacias
私はこれを見つけました。http://edgeguides.rubyonrails.org/active_record_callbacks.html#transaction-callbacks – rmacias
'after_commit:sure_one_active_address'がトリックを行いました。ありがとう!! – rmacias