kem*_*hee 5 postgresql ruby-on-rails thread-safety ruby-on-rails-4 rails-activerecord
如何使用postgresql在rails 4中创建以下控制器线程安全:
def controller_action
if Model.exists(column_name:"some_value")
else
@model=Model.new(column_name:"some_value")
@model.save
end
end
Run Code Online (Sandbox Code Playgroud)
我正在运行puma,所以我担心的是,如果两个线程同时运行此控制器,并且不存在具有指定值column_name的行,则将创建两个记录,而我只想要1.
Cra*_*ger 13
与注释相反,同一个表上的并发插入在PostgreSQL中是完全允许的,因此这里存在竞争条件.
为了确保安全,您必须具有unique
约束(或primary key
)column_name
.然后,重复插入将抛出异常,您可以捕获并重试更新.
如果没有唯一约束,则必须LOCK TABLE ... IN EXCLUSIVE MODE
防止并发upsert.或者使用以下描述的并发安全方法之一:
如何在PostgreSQL中UPSERT(MERGE,INSERT ...在DUPLICATE UPDATE上)?
归档时间: |
|
查看次数: |
2371 次 |
最近记录: |