Когда начинаются транзакции при использовании (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: сохранение и уничтожение завернуты в транзакции.