Mongoid 中的 find_or_create_by 线程安全吗?

2024-05-14

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

poll = Poll.find_or_create_by(fields)

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


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

看着可修改.rb https://github.com/mongoid/mongoid/blob/7ac104ce42401602b829ebee939bb2f9944b8411/lib/mongoid/criterion/modifiable.rb and many.rb https://github.com/mongoid/mongoid/blob/165b4c6e1c2e53fe705c74444ea054ffa7602c72/lib/mongoid/relations/many.rb它似乎没有锁定任何资源。

在我看来,它只是执行“where().first”查询,然后如果没有返回任何内容,则执行“create”查询:

 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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mongoid 中的 find_or_create_by 线程安全吗? 的相关文章

随机推荐

  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 缺失的事件如何重播?

    我正在尝试了解有关 CQRS 和事件溯源 事件存储 的更多信息 我的理解是 在这种情况下通常不使用消息队列 总线 消息总线可用于促进微服务之间的通信 但它通常不专门用于 CQRS 然而 我目前的看法是 消息总线将非常有用 可以保证读取模型最
  • symfony2 FOSRestBundle 注释

    有人在控制器中使用过 put get post delete 注释 https github com FriendsOfSymfony FOSRestBundle blob master Controller Annotations 吗 我
  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • Amazon S3:静态网站:自定义域或子域

    Amazon com 刚刚宣布可以在 S3 存储桶中托管静态网站 我访问了他们的设置页面http docs amazonwebservices com AmazonS3 latest dev index html WebsiteHostin
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • SwiftUI - 从 NSObject 继承的 ObservableObject 在 iOS 13 中不会更新

    我知道 这是 无法在 iOS XX 中工作 问题之一 但我完全陷入困境 所以我有一个ObservableObject继承自的类NSObject 因为我需要听委托方法UISearchResultsUpdating class SearchBa
  • 在 JQuery ui 自动完成中显示图像

    我有一个带有 JQuery ui 自动完成功能的脚本 可以完美运行 有一个显示用户名字和姓氏的搜索过程 但在我的数据库中 还有用户的图片 我想将其显示在带有名字和姓氏的建议中 数据库中pic包含图片url 剧本 function searc
  • 按降序排序映射java8 [重复]

    这个问题在这里已经有答案了 private static
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • Qt 文件对话框默认后缀不起作用

    我将以下代码用于 QtQuick Dialogs 1 3 和 Qt 5 10 0 下 filedialog 的新属性 我使用 Qt Creator 5 10 默认套件构建它 import QtQuick 2 10 import QtQuic
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 使 Chrome 扩展弹出窗口透明

    我正在写一个 chrome 扩展 我想知道是否有办法使弹出窗口透明 即即使弹出窗口覆盖当前页面 用户也可以看到当前页面的内容 谢谢你 昨天我想到了一个有趣的想法 虽然你不能删除白色背景 但你仍然可以mimic透明背景 这可以通过在打开弹出窗
  • Browserify:如果需要,使用 module.exports,否则暴露全局

    我正在考虑采用浏览器化 http browserify org 对于我的一些项目 但想确保其他人如果想使用 捆绑的 代码就不必使用 browserify 执行此操作的明显方法是通过以下方式公开模块导出module exports以及通过一个
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • 是否可以将一位的位向量转换为 SMTLib2 中的布尔变量?

    我想要一个布尔变量来测试 例如 位向量的第三位是否为 0 位向量的理论允许提取 1 位作为位向量 但不是布尔类型 我想知道我是否可以出演这个角色 谢谢 更新 如果我的问题不清楚 我很抱歉 但 Nikolaj Bjorner 的答案是如何测试
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • Xamarin.Forms DataTemplateSelector 不适用于 iOS(未调用构造函数)

    我正在膨胀数据模板选择器 如下所示
  • 复制文件时 Ant 重命名

    如何在将文件复制到ant中的目录时重命名文件
  • Mongoid 中的 find_or_create_by 线程安全吗?

    我有一个使用 Mongoid 的 find or create by 方法的网络应用程序 poll Poll find or create by fields 在投入生产之前 我尝试运行故障场景 我发现多个用户可以尝试使用此方法访问此资源