Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在这个简单的例子中,如何防止竞争条件?_Ruby On Rails_Rails Activerecord_Race Condition_Pessimistic Locking - Fatal编程技术网

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

Ruby on rails 在这个简单的例子中,如何防止竞争条件?,ruby-on-rails,rails-activerecord,race-condition,pessimistic-locking,Ruby On Rails,Rails Activerecord,Race Condition,Pessimistic Locking,如果用户还没有外部API,下面的代码将从外部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\u

如果用户还没有外部API,下面的代码将从外部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\u address
请求进入,它们可能都会传递
当前的\u user.address.blank?
检查并创建两个地址(无论调用什么
update!
last都会覆盖另一个地址)


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

例如,您必须对当前用户使用锁定:

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