mongoid:处理并发find_or_create_by

时间:2014-05-14 13:56:41

标签: ruby-on-rails mongodb mongoid

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

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

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:3)

我会把这个转换为两个操作来使这个原子:1)找到2)如果没有找到那么UPSERT

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

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/)这将确保唯一性。