2

如果用户还没有地址,下面的代码将从外部 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!最后调用的地址将覆盖另一个地址)。

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

4

1 回答 1

4

例如,您必须使用 lock on current_user

current_user.with_lock do
  if current_user.address.blank?
    data = AddressAPI.create_address
    current_user.update!(address: data['address'])
  end
end
于 2016-05-28T07:46:29.947 回答