Когда начинаются транзакции при использовании (restful) rails
-
02-07-2019 - |
Вопрос
Так ли это, что весь глагол restful находится в рамках одной всеобъемлющей транзакции?То есть, если я вызываю ошибку при проверке или обратных вызовах в любой момент обработки операции ОБНОВЛЕНИЯ, УДАЛЕНИЯ или СОЗДАНИЯ, выполняется ли откат каждой операции с базой данных, которую я, возможно, выполнял в предыдущих обратных вызовах, также?вкратце, приводит ли возникновение ошибки при любом обратном вызове или проверке к тому, что в базе данных вообще не происходит никаких изменений для этого действия с глаголом?
Решение
Так ли это, что весь глагол restful находится в рамках одной всеобъемлющей транзакции?
НЕТ
если я выдаю ошибку при проверке или обратных вызовах в любой момент обработки операции ОБНОВЛЕНИЯ, УДАЛЕНИЯ или СОЗДАНИЯ, выполняется ли откат каждой операции с базой данных, которую я, возможно, выполнял в предыдущих обратных вызовах, также?
Нет.
приводит ли возникновение ошибки при любом обратном вызове или проверке к тому, что в базе данных для этого действия с глаголом вообще не происходит никаких изменений?
Нет.
Если вы хотите такого поведения, вы можете либо явно создавать транзакции в своем контроллере (см. Примеры, предоставленные другими пользователями), либо использовать around_filter
чтобы привязать это поведение ко всем вашим действиям restful.
Другие советы
По умолчанию внутри транзакции не записан код базы данных, вам нужно указать ему, чтобы он сделал это в коде.
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!методы попытаются сохранить запись, и если им это не удастся, они вызовут исключение, которое затем откатит любой код, уже выполненный внутри блока транзакции.
Если вы не сохраните действие, вы будете перенаправлены на (я думаю) a 405.html в вашем общедоступном каталоге, если таковой существует.
Некоторые методы (create, destroy) сразу попадают в базу данных.Транзакции выполняются с использованием метода transaction для классов, производных от ActiveRecord, следующим образом:
Student.transaction do
Course.transaction do
course.enroll(student)
student.units += course.units
end
end
(Этот пример предназначен для нескольких баз данных.Для одной базы данных вам нужна только одна транзакция.)
Затем вы можете выполнить откат этих транзакций, и исключения, созданные внутри транзакции, распространяются после отката.
Это зависит от базы данных, имеющей транзакции.
Примечание:сохранение и уничтожение заключены в транзакции.