Пессимистическая блокировка не работает

У меня есть следующий код в моем контроллере:

Item.transaction do
  item = JobDistribution.lock(true).find(params[:id])
  item.update_attributes(status: JobDistribution.statuses[:processing])
  respond_to do |format|
    format.json { render :json => "object processing", status: :success }
  end
end

но когда я запускаю код, я получаю сообщение об ошибке:

Попытка обновить устаревший объект: элемент

Я не понимаю, почему, я следил за документацией по рельсам.


person bl0b    schedule 04.11.2015    source источник
comment
Из какой документации вы это узнали? Вы пытаетесь перезаписать новые данные старыми, пока новые заблокированы.   -  person Robin    schedule 04.11.2015
comment
@Robin api.rubyonrails.org/classes/ActiveRecord/Locking/   -  person bl0b    schedule 04.11.2015
comment
У вас есть столбец lock_version? Это последний номер, когда вы пытаетесь запустить транзакцию?   -  person Robin    schedule 04.11.2015
comment
@Robin У меня есть столбец версии блокировки, и вот неудачный SQL-запрос: UPDATE "items" SET "status" = 1, "updated_at" = '2015-11-04 11:54:36.422768', "lock_version" = 1 WHERE ("items"."id" = 35 AND "items"."lock_version" = 0)   -  person bl0b    schedule 04.11.2015


Ответы (1)


lock_version для оптимистичной блокировки, вы также используете пессимистическую блокировку с цепочкой find из lock. Rails путается между ними — выбирайте одно или другое.

person smathy    schedule 04.11.2015