如果用户还没有,我们会从外部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!
最后会覆盖另一个)。
我们如何防止这种情况?我们需要使用某种锁定机制吗?
答案 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