Рельсы делают откат, если я использую начало... спасения?
Я хотел бы добавить начальный... блок спасения в один из методов создания контроллеров, чтобы лучше узнать информацию и построить правильное сообщение об ошибке, чтобы вернуться к клиенту. Помогает ли спасение каким-либо образом "прерывать" процесс отката?
Я предполагаю, что рельсы автоматически откат. Когда это происходит? Это уже произошло к тому моменту, когда я попал в предложение о спасении?
Я использую mySQL на Dreamhost, и я думаю, что они используют innoDB.
Ответы
Ответ 1
Я экспериментировал с этим. Похоже, если ваше спасение поймает исключение, вызвавшее откат, часть транзакции, которая уже произошла, совершается. В моем случае я хочу, чтобы база данных вернулась к тому, как она была до начала транзакции, но я все еще хочу обработать исключение.
Я закончил с этим:
self.transaction do
first_operation
begin
operation_that_might_violate_db_constraint
rescue ActiveRecord::RecordNotUnique
#deal with the error
raise ActiveRecord::Rollback #force a rollback
end
end
Часть raise ActiveRecord::Rollback
гарантирует полную откат транзакции. Без него изменения от first_operation
в конечном итоге будут совершены.
ActiveRecord:: Rollback - это особый вид исключения, который не пузырится выше уровня транзакции, поэтому вы не получите неперехваченное исключение, которое отображает страницу с ошибкой.
Я не уверен, что это золотой стандарт для этого, но, похоже, он работает.
Ответ 2
Простое использование begin
... rescue
недостаточно для отката транзакции. Вам необходимо использовать:
ModelName.transaction do
end
Это делается явно при вызове сохранения, так что все ваши обратные вызовы выполняются вместе. Какие исключения вы ловите в своем спасательном блоке? На что вы отвечаете? Какие ошибки?
Ответ 3
Откат не обрабатывается.
Пример:
create_table "helps", :force => true do |t|
t.string "title", :null => false
t.text "content"
end
#Rails console
Help.transaction do
Help.create! title: "aaa"
begin
Help.create! content: "111"
rescue
p "create error."
end
Help.create! title: "bbb"
end
#get this
>> "create error."
Help.count
>> 2
Ответ 4
Вы также можете попробовать мой ответ для отката, улова и рендеринга для вашего метода создания с помощью ActiveRecord:: Base.transaction: -
Нажмите здесь
Спасибо