![](/img/trans.png)
[英]Does a rollback still occur if I use begin…rescue and an error occurs?
[英]Does rails do a rollback if I use begin…rescue?
我想在我的一個控制器創建方法中添加一個begin ... rescue block,以便記錄更好的信息並構造正確的錯誤消息以返回給客戶端。 救援以任何方式“中斷”回滾過程嗎?
我假設rails自動進行回滾。 它什么時候發生? 在我獲得救援條款時,它已經發生了嗎?
我在Dreamhost上使用mySQL,我認為他們使用的是innoDB。
我一直在試驗這個。 看起來如果你的救援捕獲了導致回滾的異常,那么已經發生的事務部分就會被提交。 在我的情況下,我希望數據庫回滾到事務開始之前的方式,但我仍然想要處理異常。
我最終得到了這個:
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
的變化first_operation
會被提交。
ActiveRecord :: Rollback是一種特殊的異常,它不會超出事務級別,因此您不會得到呈現錯誤頁面的未捕獲異常。
我不確定這是做這個的黃金標准方式,但似乎有效。
僅使用begin
... rescue
不足以回滾事務。 你需要使用:
ModelName.transaction do
end
這是在保存調用時明確完成的,因此所有回調都是一起執行的。 你在救援區有什么例外? 你在回應什么? 什么樣的錯誤?
回滾不被處理。
例如:
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
您還可以嘗試使用ActiveRecord :: Base.transaction為您的create方法回滾,捕獲和渲染: - 單擊此處
謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.