2008-09-23 6 views
6

Ist es der Fall, dass das gesamte restliche Verb unter einer einzigen allumfassenden Transaktion steht? Das heißt, wenn ich einen Fehler in der Überprüfung oder Rückrufe an irgendeinem Punkt in der Behandlung einer UPDATE-, DELETE- oder CREATE-Operation erhalte, wird jede Datenbankoperation, die ich in früheren Rückrufen durchgeführt habe, ebenfalls zurückgesetzt? Führt die Erhöhung eines Fehlers bei einem Rückruf oder einer Überprüfung dazu, dass überhaupt keine Änderung in der Datenbank für diese Verbaktion auftritt?Wann fangen Transaktionen an, wenn (erholsame) Schienen verwendet werden

Antwort

3

Ist das ganze restful Verb unter einer einzigen alles umfassenden Transaktion?

Keine

, wenn ich einen Fehler bei der Validierung oder Rückrufen an jedem beliebigen Punkt im Umgang mit einer UPDATE erhöhen, DELETE oder Operation CREATE ist jede Datenbankoperation, die ich in früheren ausgeführt habe Callbacks rollten auch zurück?

Nr

macht einen Fehler bei jedem Rückruf oder Validierung Erhöhung macht es so, dass keine Änderung überhaupt in der Datenbank für diese Verbhandlung auftritt?

Nr

Wenn Sie dieses Verhalten wünschen, können Sie entweder explizit Transaktionen in Ihrem Controller erstellen (siehe die Beispiele von anderen Benutzern zur Verfügung gestellt), oder ein around_filter verwenden das Verhalten auf all Ihren erholsamen Aktionen zu befestigen.

1

Einige Methoden (create, destroy) gehen sofort in die Datenbank. Transaktionen erfolgen durch die Transaktion Methode auf Klassen von Active wie folgt abgeleitet: (. Dieses Beispiel ist für mehrere Datenbanken für eine einzelne Datenbank, Sie nur eine Transaktion benötigen.)

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

Anschließend können Sie Rollback Für diese Transaktionen werden in der Transaktion ausgegebene Ausnahmen nach dem Rollback propagiert.

Dies hängt von der Datenbank mit Transaktionen ab.

NB: speichern und zerstören sind in Transaktionen verpackt.

+0

Sie müssen die Transaktionen nicht verschachteln. Alle Aufrufe von .transaction werden nur an ActiveRecord :: Base übergeben. Sie rufen ActiveRecord :: Base.transaction einfach zweimal auf –

+0

Dies ist ein Beispiel aus der Rails-Dokumentation. –

+0

Ah! Ich sehe, dass es für mehrere Datenbanken erforderlich ist. Aktualisiert. –

4

Standardmäßig ist kein Datenbankcode innerhalb einer Transaktion geschrieben, Sie müssen es dem Code mitteilen.

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 

Mit #create! Methoden werden versuchen, den Datensatz zu speichern, und wenn sie fehlschlagen, werden sie eine Ausnahme auslösen, die dann jeden bereits im Transaktionsblock ausgeführten Code zurücksetzt.

Wenn Sie die Aktion nicht retten, werden Sie auf (ich denke) eine 405.html in Ihrem öffentlichen Verzeichnis umgeleitet, falls eine existiert.