ActiveRecord :: StatementInvalid·Mysql2 :: Error:尝试获取锁定时发现死锁;尝试重启事务:

时间:2016-06-14 19:01:01

标签: sql ruby-on-rails activerecord

所以我有这个运行的post_save方法,以确保当前的地址对象是该用户下唯一活动的地址。

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

我无法重现错误,只在生产中发生。我理解错误的含义,但我不明白它在哪里发生。 update_all是在查询完成之前发生的吗?

1 个答案:

答案 0 :(得分:0)

如果您确实想要使用此回调,则应使用after_commit代替after_save