0

次のコードは、外部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 

2つの同時create_address要求が来る場合、それは彼らが両方current_user.address.blank?チェックを通過しますが可能ですし、 2つのアドレスが作成されます(最後にupdate!と呼ばれるものは、もう1つが上書きされます)。

どうすればこの問題を防ぐことができますか?何らかのロック機構を使用する必要がありますか?

答えて

1

たとえばあなたがcurrent_userのロックを使用する必要があります。

current_user.with_lock do 
    if current_user.address.blank? 
    data = AddressAPI.create_address 
    current_user.update!(address: data['address']) 
    end 
end 
関連する問題