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



所以我有这个after_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是否在 where 查询完成之前发生?

如果你真的想使用这个回调,你应该使用 after_commit 而不是 after_save

最新更新