处理find_or_create_by竞争条件

时间:2015-03-02 02:08:55

标签: ruby-on-rails ruby-on-rails-4

众所周知,这种情况很容易受到竞争条件的影响。

一种解决方案是:

validates :unique_id, uniqueness: true

然后

begin
  Model.find_or_create_by(attributes)
rescue ActiveRecord::RecordNotUnique
  retry
end

还有另一种没有唯一性约束的方法吗?这是一个经常发生的动作,如果我没有弄错,唯一性约束要求每次都要遍历整个数据库表,IMO速度很慢。

1 个答案:

答案 0 :(得分:0)

正确的方法是在“unique_id”上添加英国,这将使用BTree索引,这意味着不会慢或你可以使用乐观锁