Ruby on rails 在这个简单的例子中,如何防止竞争条件?
如果用户还没有外部API,下面的代码将从外部API获取新地址: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
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