簡體   English   中英

如果我使用begin ... rescue,rails會做回滾嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM