Несколько запросов в один и тот же момент времени, рельсы не могут обработать обновление типа столбца массива - PullRequest
0 голосов
/ 06 июня 2018

Я получаю несколько запросов к конечной точке от внешнего интерфейса.Например, внешний интерфейс загружает 10 изображений в облако Google, и всякий раз, когда внешний интерфейс получает ответ от облака Google, он вызывает API-интерфейс к внутреннему интерфейсу для сохранения записи ресурса в БД.В базе данных asset_ids хранятся в столбце с именем asset_ids типа массива.Теперь проблема в том, что из 10 изображений некоторые изображения не сохраняются в столбце массива.Некоторые запросы пытаются переопределить предыдущие данные в столбце массива.

Примечание: - Когда я пытался с оптимистической блокировкой, я получаю исключение как ActiveRecord::StaleObjectError.Итак, какой будет простой подход к решению проблемы.

Ниже приведена конечная точка, которая обрабатывает запросы.

def upload_assets
    gcs = GoogleCloud::StoreAssetDetail.new(file_upload_params, current_user: current_user)
    if gcs.process
      @gallery.asset_ids << gcs.asset_id
      @gallery.name = gallery_params[:name] if gallery_params[:name].present?
      if @gallery.save
        asset = Asset.find(gcs.asset_id)
        render json: { asset_id: asset.id, imgix_url: asset.decorate.imgix_cdn }, status: :created
      else
        respond_with_error(@gallery.errors.full_messages.join(', '), :unprocessable_entity, @gallery.errors)
      end
    else
      respond_with_error(gcs.errors.full_messages.join(', '), :unprocessable_entity, gcs.errors)
    end
  rescue ActiveRecord::StaleObjectError
    puts "Error while uploading"
  end

1 Ответ

0 голосов
/ 07 июня 2018

У меня есть решение проблемы, с которой я столкнулся.Причиной проблемы было несколько запросов, пытающихся обновить одну и ту же запись одновременно.Итак, просмотрели документацию по устаревшим объектам и применили Пессимистический подход к блокировке.В пессимистической блокировке объект блокируется и блокируется даже для чтения другим запросом, если блокировка не снята (в моем случае блокировка снимается, когда запись сохраняется).Следовательно, этот подход решил мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...