【问题标题】:mongoid : deal with concurrent find_or_create_bymongoid : 处理并发 find_or_create_by
【发布时间】:2014-05-14 13:56:40
【问题描述】:

在 mongoid 中使用 find_or_create_by 时有没有办法处理并发?

我正在使用Tag.find_or_create_by(name: "foo") 标记我的应用程序中的一些项目。

Tag 模型中,我还使用了唯一性验证:validates_uniqueness_of :name

但是,当用户在短时间内发送多个帖子请求时,我的数据库中会出现重复的标签。

我想我理解为什么会发生这种行为,但我不知道如何让它按预期工作。任何的想法 ?

谢谢!

【问题讨论】:

  • 你能在你的问题中证明你的实际问题吗?到目前为止,您发布的内容可以有多种解释。
  • 很明显,当他在多个线程中同时使用find_or_create_by时,即使使用validates_uniqueness_of属性,也可以创建几次记录。

标签: ruby-on-rails mongodb mongoid


【解决方案1】:

我会将其转换为两个操作以使其成为原子操作:1)查找 2)如果未找到则 UPSERT

编辑:或者,使用唯一索引并捕获/消除抛出的唯一异常。

EDIT2:

为了让这成为一个“真正的答案”,我会详细说明。

为了保持这是一个单一的事务操作,您可以确保您希望的字段上的唯一索引 (http://docs.mongodb.org/manual/tutorial/create-a-unique-index/)。以多线程方式使用 find_or_create_by 将正常工作,只要您能够捕获和消除发现重复键时发生的异常/错误(您必须查看您使用的语言)

或者将其转换为两个交易。首先根据您的标准进行查找,如果没有找到结果,请插入。在此处进行正常插入也会产生问题,但是使用 upsert 操作(使用 upsert 选项更新 - http://docs.mongodb.org/manual/reference/method/db.collection.update/)这将确保唯一性。

【讨论】:

  • 感谢upsert,不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 2011-01-02
相关资源
最近更新 更多