gpt4 book ai didi

ruby-on-rails - 如何使 ActiveRecord 成为线程安全的

转载 作者:行者123 更新时间:2023-11-29 11:26:20 25 4
gpt4 key购买 nike

如何使用 postgresql 在 Rails 4 中使以下 Controller 线程安全:

def controller_action
if Model.exists(column_name:"some_value")
else
@model=Model.new(column_name:"some_value")
@model.save
end
end

我正在运行 puma,所以我担心的是如果两个线程同时运行这个 Controller ,并且不存在具有指定 column_name 值的行,将创建两个记录,而我只想要 1 个。

最佳答案

与评论相反,在 PostgreSQL 中完全允许在同一个表上并发插入,因此这里存在竞争条件。

为了保证安全,您必须在 column_name 上有一个 unique 约束(或 primary key)。重复插入将抛出一个异常,您可以捕获该异常并通过更新重试。

如果您没有唯一约束,则必须LOCK TABLE ... IN EXCLUSIVE MODE 以防止并发更新插入。或者使用以下内容中描述的并发安全方法之一:

How to UPSERT (MERGE, INSERT ... ON DUPLICATE UPDATE) in PostgreSQL?

关于ruby-on-rails - 如何使 ActiveRecord 成为线程安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22211547/

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