2008-09-23 57 views
6

整個寧靜的動詞是在一個單一的包容性交易?也就是說,如果我在處理UPDATE,DELETE或CREATE操作的任何時候在驗證或回調中引發錯誤,那麼在之前的回調中可能執行的每個數據庫操作也會回滾?簡單地說,在任何回調或驗證中引發一個錯誤會導致數據庫中該動詞操作完全沒有發生任何變化?什麼時候交易開始時使用(寧靜)軌道

回答

3

整個寧靜的動詞是在一個單一的包容性交易下嗎?

沒有

,如果我在一個更新的處理任何一點提高在驗證或回調一個錯誤,刪除或創建操作,就是我可以在以前已執行的每一個數據庫操作回調也回滾了?

做任何回調或驗證使撫養錯誤它使得在沒有變化的數據庫中該動詞的動作發生?

如果你希望這個行爲,你可以明確地建立在你的控制器交易(查看其他用戶提供的例子),或使用around_filter的行爲附加到你所有的寧靜行動。

1

一些方法(創建,銷燬)立即轉到數據庫。交易通過使用ActiveRecord的派生類的交易方法如下發生:(這個例子是多個數據庫對於一個單一的數據庫,你只需要一個事務。)

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

然後,您可以回滾在這些事務上,事務內拋出的異常在回滾之後傳播。

這取決於具有交易的數據庫。

注意:保存和銷燬包裝在交易中。

+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 

使用#create!方法將嘗試保存記錄,如果它們失敗,它們將引發異常,然後回滾已在事務塊內執行的任何代碼。

如果您不拯救該行爲,您將被重定向到(我認爲)您公共目錄中的405.html(如果存在)。