Когда начинаются транзакции при использовании (релакс) рельсов - PullRequest
6 голосов
/ 24 сентября 2008

Это тот случай, когда весь остальной глагол находится под одной всеобъемлющей транзакцией? То есть, если в какой-либо момент обработки операции UPDATE, DELETE или CREATE я выдаю сообщение об ошибке в проверке или обратном вызове, откатывается ли каждая операция базы данных, которую я мог выполнить в предыдущих обратных вызовах? Короче говоря, вызывает ли ошибка «Ошибка» при любом обратном вызове или проверке правильность такого действия, что в базе данных не происходит никаких изменений для этого действия глагола?

Ответы [ 3 ]

4 голосов
/ 24 сентября 2008

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

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 в вашем публичном каталоге, если таковой существует.

3 голосов
/ 24 сентября 2008

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

нет

Нет

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

Количество

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

номер

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

1 голос
/ 24 сентября 2008

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...