在这个简单的例子中如何防止竞争条件?

时间:2016-05-28 07:32:07

标签: ruby-on-rails rails-activerecord race-condition pessimistic-locking

如果用户还没有,我们会从外部API获取新地址:

def create_address

  if current_user.address.blank?
    data = AddressAPI.create_address
    current_user.update!(address: data['address'])
  end

  render json: { address: current_user.address }
end

如果有两个并发的create_address请求进入,则他们可能会通过current_user.address.blank?检查,并且会创建两个地址(无论何时调用update!最后会覆盖另一个)。

我们如何防止这种情况?我们需要使用某种锁定机制吗?

1 个答案:

答案 0 :(得分:2)

例如,您必须在current_user上使用锁定:

current_user.with_lock do
  if current_user.address.blank?
    data = AddressAPI.create_address
    current_user.update!(address: data['address'])
  end
end
相关问题