我从前端收到多个请求到端点。
例如,前端将10张图像上传到谷歌云,每当前端从谷歌云获得响应时,他们会对后端进行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
答案 0 :(得分:0)
我找到了我面临的问题的解决方案。问题的原因是尝试同时更新同一记录的多个请求。因此,浏览了有关陈旧对象的rails文档,并继续使用悲观锁定方法。在悲观锁定中,对象被锁定并被禁止甚至被其他请求读取,除非锁被释放(在我的情况下,在保存记录时释放锁)。因此,这种方法解决了我的问题。