gpt4 book ai didi

ruby-on-rails - mongoid : deal with concurrent find_or_create_by

转载 作者:可可西里 更新时间:2023-11-01 10:04:24 33 4
gpt4 key购买 nike

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

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

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

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

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

谢谢!

最佳答案

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

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

编辑2:

为了使这个成为“真正的答案”,我将详细说明。

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

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

关于ruby-on-rails - mongoid : deal with concurrent find_or_create_by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23656760/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com