2008-09-23 2 views
6

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

ответ

3

В этом случае весь успокоительный глагол находится под единой всеохватывающей сделкой? не

Нет

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

No.

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

No.

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

1

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

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

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

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

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

+0

Вам не нужно влагать такие транзакции. Любые обращения к .transaction просто передаются в ActiveRecord :: Base. Вы буквально просто вызываете ActiveRecord :: Base.transaction дважды – 2008-09-23 23:35:34

4

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

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 

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

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

Смежные вопросы