加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – ActiveRecord的find_or_create *方法是否存在

发布时间:2020-12-17 03:50:36 所属栏目:百科 来源:网络整理
导读:有几个方法:first_or_create_by,find_or_create_by等,其工作原理如下: 与数据库交谈,试图找到我们想要的东西 如果我们没有找到它,那就自己动手吧 将其保存到数据库 显然,这些方法的并发调用可能使两个线程都找不到他们想要的东西,并且在步骤3中,一个人意外
有几个方法:first_or_create_by,find_or_create_by等,其工作原理如下:

>与数据库交谈,试图找到我们想要的东西
>如果我们没有找到它,那就自己动手吧
>将其保存到数据库

显然,这些方法的并发调用可能使两个线程都找不到他们想要的东西,并且在步骤3中,一个人意外地失败.

似乎是一个更好的解决方案,
create_or_find

那是:

>提前在数据库中创建合理的唯一性约束.
>如果你想保存它,请保存一些东西
>如果有效,那就好.
>如果由于RecordNotUnique异常而无法正常工作,那么它已经存在,很棒,加载它

那么在什么情况下我想使用Rails内置的东西而不是我自己的(看似更可靠)create_or_find?

解决方法

挖掘之后,我将回答我自己的问题.

用于查找或创建的文档说:

Please note this method is not atomic,it runs first a SELECT,and
if there are no results an INSERT is attempted. If there are other
threads or processes there is a race condition between both calls and
it could be the case that you end up with two similar records.

Whether that is a problem or not depends on the logic of the
application,but in the particular case in which rows have a UNIQUE
constraint an exception may be raised,just retry:


begin
CreditAccount.find_or_create_by(user_id: user.id)
rescue ActiveRecord::RecordNotUnique
retry
end

通常,这将比create_or_find具有更好的性能.

考虑到create_or_find在成功的情况下将需要1个DB旅行,每个唯一记录只会发生一次.每隔一次需要2次DB跳转(创建和搜索失败).

如果失败(搜索,失败创建,再次搜索),重试的find_or_create将需要3次旅行,但这只能在非常小的窗口中发生这么多次.除此之外,每隔一次调用find_or_创建一条记录,将需要1分贝的行程.

因此,重试find_or_create的摊销成本更好,并且很快就达到了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读