Когда начинаются транзакции при использовании (restful) rails

Это тот случай, когда весь глагол restful находится под одной всеохватывающей транзакцией? То есть, если я вызываю ошибку в проверке или обратных вызовах в любой момент обработки операции обновления, удаления или создания, каждая операция базы данных, которую я мог выполнить в предыдущих обратных вызовах, также откатывается? Короче говоря, вызывает ли ошибка при любом обратном вызове или проверке так, что в базе данных для этого действия глагола не происходит никаких изменений?

3 ответов


это тот случай, когда весь глагол restful находится под одной всеохватывающей транзакцией?

нет

Если я вызываю ошибку в проверке или обратных вызовах в любой момент обработки операции обновления, удаления или создания, каждая операция базы данных, которую я мог выполнить в предыдущих обратных вызовах, также откатывается?

нет.

вызывает ли ошибка при любом обратном вызове или проверке сделать так, чтобы в базе данных не происходило никаких изменений для этого действия глагола?

нет.

Если вы хотите этого поведения, вы можете либо явно создавать транзакции в своем контроллере (см. примеры, предоставленные другими пользователями), либо использовать around_filter чтобы прикрепить поведение ко всем вашим спокойным действиям.


по умолчанию нет кода базы данных внутри транзакции, вы должны сказать ему, чтобы сделать это в коде.

def create
  Model.transaction do
    Model.create!(params[:model])
    Model.association.create!(params[:association])
  end
  rescue ActiveRecord::RecordNotSaved, ActiveRecord::RecordInvalid
    flash[:notice] = "That record could not be saved."
    render :action => "new"
end

использование #create! методы попытаются сохранить запись, и если они потерпят неудачу, они вызовут исключение, которое затем откатит любой код, уже выполненный внутри блока транзакций.

Если вы не спасете действие, вы будете перенаправлены на (Я думаю) 405.html в общедоступном каталоге, если он существует.


некоторые методы (create, destroy) немедленно переходят в базу данных. Транзакции происходят с помощью метода transaction для классов, производных от ActiveRecord следующим образом:

Student.transaction do
  Course.transaction do
    course.enroll(student)
    student.units += course.units
  end
end

(этот пример для нескольких баз данных. Для одной базы данных требуется только одна транзакция.)

затем вы можете откатить эти транзакции, и исключения, создаваемые внутри транзакции, распространяются после отката.

Это зависит от наличия базы данных операции.

NB: сохранение и уничтожение завернуты в транзакции.