我正在尝试强制表字段之一中值的唯一性。改变桌子不是一个选择。我需要使用 ActiveRecord 有条件地将一行插入表中,但我担心同步。
Does first_or_create
Rails ActiveRecord 中的防止竞争条件?
这是源代码first_or_create
来自 GitHub:
def first_or_create(attributes = nil, options = {}, &block)
first || create(attributes, options, &block)
end
由于多个进程的同步问题,是否有可能导致数据库出现重复条目?
铁轨4的文档find_or_create_by http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-find_or_create_by提供了对这种情况可能有用的提示:
请注意这个方法不是原子的,它首先运行 SELECT,如果没有结果,则尝试 INSERT。如果存在其他线程或进程,则两个调用之间存在竞争条件,并且最终可能会得到两个相似的记录。
这是否是一个问题取决于应用程序的逻辑,但在行具有 UNIQUE 约束的特定情况下,可能会引发异常,只需重试:
begin
CreditAccount.find_or_create_by(user_id: user.id)
rescue ActiveRecord::RecordNotUnique
retry
end
类似的错误捕获对于 Rails 3 可能很有用。(不确定是否相同ActiveRecord::RecordNotUnique
Rails 3 中会抛出错误,因此您的实现可能需要有所不同。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)