【发布时间】:2012-05-17 18:42:46
【问题描述】:
我正在尝试在我的一个表字段中强制执行值的唯一性。更换桌子不是一种选择。我需要使用 ActiveRecord 有条件地向表中插入一行,但我担心同步。
Rails ActiveRecord 中的first_or_create 是否可以防止竞争条件?
这是来自 GitHub 的 first_or_create 的源代码:
def first_or_create(attributes = nil, options = {}, &block)
first || create(attributes, options, &block)
end
是否有可能由于多进程同步问题导致数据库中出现重复条目?
【问题讨论】:
-
AR 充满了这样的竞争条件。
-
参见(SO dup)How do I avoid a race condition in my Rails app? 和 Rails Cookbook Avoiding Race Conditions with Optimistic Locking
-
@dbenhur - 我不能使用乐观锁定,因为它涉及向表中添加一个字段。我的条件之一是我不能添加一个字段,所以它不是重复的。
-
如果你不能使用乐观锁,你可以尝试显式的悲观锁(虽然这会损害性能),或者你可以在数据库中添加约束,并捕获约束违规,并使用适当的语义重试.
标签: ruby-on-rails ruby-on-rails-3 activerecord