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 

Если два одновременных create_address запросы поступают в, возможно они оба проходят проверку и current_user.address.blank? будут созданы два адреса (все, что будет называться update!, последнее будет отменено другим).

Как мы можем предотвратить это? Нужно ли использовать какой-то механизм блокировки?

ответ

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