2016-06-14 66 views
0

所以我有这个after_save方法运行,以确保此当前地址对象是该用户下的唯一活动地址。ActiveRecord :: StatementInvalid·Mysql2 :: Error:尝试获取锁定时发现死锁;尝试重新启动事务:

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查询可以完成之前发生?

回答

0

如果您确实想使用此回调,则应使用after_commit而不是after_save

+0

我没有在文档上找到'after_transaction'。我应该提到我在3.2 你是指'after_commit'? 我得到'after_save'的提示意味着当我运行这个查询时,我仍然在保存事务中? – rmacias

+0

我发现这个,http://edgeguides.rubyonrails.org/active_record_callbacks.html#transaction-callbacks – rmacias

+0

'after_commit:ensure_one_active_address'完成了这个诀窍。谢谢!! – rmacias

相关问题