Mar*_*ska 15 activerecord ruby-on-rails ruby-on-rails-3
我正试图在我的一个表字段中强制执行值的唯一性.更改表格不是一种选择.我需要使用ActiveRecord有条件地在表中插入一行,但我担心同步.
first_or_create
在Rails ActiveRecord中是否可以防止竞争条件?
这是first_or_create
来自GitHub 的源代码:
def first_or_create(attributes = nil, options = {}, &block)
first || create(attributes, options, &block)
end
Run Code Online (Sandbox Code Playgroud)
由于多个进程的同步问题,重复条目是否可能导致数据库?
Chr*_*ers 20
Rails 4 文档find_or_create_by
提供了一个可能对此情况有用的提示:
请注意,此方法不是原子方法,它首先运行SELECT,如果没有结果,则尝试INSERT.如果存在其他线程或进程,则两个调用之间存在竞争条件,并且最终可能会出现两个类似的记录.
这是否是一个问题取决于应用程序的逻辑,但在行具有UNIQUE约束的特定情况下,可能会引发异常,只需重试:
Run Code Online (Sandbox Code Playgroud)begin CreditAccount.find_or_create_by(user_id: user.id) rescue ActiveRecord::RecordNotUnique retry end
类似的错误捕获可能对Rails 3有用.(不确定是否ActiveRecord::RecordNotUnique
在Rails 3中抛出相同的错误,因此您的实现可能需要不同.)
归档时间: |
|
查看次数: |
6080 次 |
最近记录: |