在Mongoid中find_or_create_by是否安全?

我有一个使用Mongoid的find_or_create_by方法的Web应用程序。

poll = Poll.find_or_create_by(fields) 

在我们投入生产之前,我正在尝试运行故障情况,并且我发现多个用户可以尝试使用此方法访问此资源。 是否有可能创建同一对象的多个实例? 我该怎么做才能防止这种情况发生?

免责声明:我是Mongoid和Rails的新手,所以我可能完全错了。

看看modifiable.rb和many.rb它似乎没有锁定任何资源。

它看起来像它只是做一个“where()。first”查询然后如果它不返回任何东西它执行“创建”查询:

  def find_or(method, attrs = {}, &block) where(attrs).first || send(method, attrs, &block) end 

对于find_or_create_by,“send”将调用“create_document”:

 def create_document(method, attrs = nil, &block) klass.__send__(method, selector.reduce(attrs || {}) do |hash, (key, value)| unless key.to_s =~ /\$/ || value.is_a?(Hash) hash[key] = value end hash end, &block) end 

结论:对我来说,这似乎是一种方便的方法,不要指望它是“线程安全的”。 我希望有更多关于此方法的文档。