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

StackOverflow https://stackoverflow.com/questions/124396

Вопрос

Так ли это, что весь глагол 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

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

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

Это зависит от базы данных, имеющей транзакции.

Примечание:сохранение и уничтожение заключены в транзакции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top