7 Stimmen

Wann beginnen Transaktionen bei der Verwendung von (restful) Rails

Ist es der Fall, dass das gesamte restful verb in einer einzigen, umfassenden Transaktion enthalten ist? Das heißt, wenn ich in der Validierung oder in Callbacks zu irgendeinem Zeitpunkt bei der Bearbeitung einer UPDATE-, DELETE- oder CREATE-Operation einen Fehler auslöse, werden dann alle Datenbankoperationen, die ich möglicherweise in früheren Callbacks durchgeführt habe, ebenfalls zurückgesetzt? Kurz gesagt: Führt das Auslösen eines Fehlers bei einem Callback oder einer Validierung dazu, dass für diese Verb-Aktion überhaupt keine Änderung in der Datenbank erfolgt?

4voto

Ryan Bigg Punkte 104835

Standardmäßig wird innerhalb einer Transaktion kein Datenbankcode geschrieben, Sie müssen dies im Code angeben.

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 den #create!-Methoden wird versucht, den Datensatz zu speichern, und wenn dies fehlschlägt, wird eine Ausnahme ausgelöst, die dann einen Rollback des bereits innerhalb des Transaktionsblocks ausgeführten Codes bewirkt.

Wenn Sie die Aktion nicht retten, werden Sie zu (ich glaube) einer 405.html in Ihrem öffentlichen Verzeichnis umgeleitet, falls ein solches existiert.

4voto

Orion Edwards Punkte 117361

Ist es der Fall, dass das gesamte restful verb in einer einzigen, umfassenden Transaktion enthalten ist?

Nein

Wenn ich in der Validierung oder in Callbacks zu irgendeinem Zeitpunkt bei der Bearbeitung einer UPDATE-, DELETE- oder CREATE-Operation einen Fehler auslöse, werden dann alle Datenbankoperationen, die ich möglicherweise in früheren Callbacks durchgeführt habe, ebenfalls zurückgenommen?

Nein.

Führt das Auslösen eines Fehlers bei einem Rückruf oder einer Validierung dazu, dass in der Datenbank für diese Verb-Aktion überhaupt keine Änderung erfolgt?

Nein.

Wenn Sie dieses Verhalten wünschen, können Sie entweder explizit Transaktionen in Ihrem Controller erstellen (siehe die von anderen Benutzern bereitgestellten Beispiele), oder Sie können eine around_filter um das Verhalten mit all Ihren erholsamen Handlungen zu verbinden.

1voto

Michael Deardeuff Punkte 9886

Einige Methoden (create, destroy) gehen sofort an die Datenbank. Transaktionen erfolgen durch die Verwendung der Transaktionsmethode für von ActiveRecord abgeleitete Klassen wie folgt:

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

(Dieses Beispiel bezieht sich auf mehrere Datenbanken. Für eine einzelne Datenbank benötigen Sie nur eine Transaktion).

Sie können dann ein Rollback für diese Transaktionen durchführen, und Ausnahmen, die innerhalb der Transaktion ausgelöst werden, werden nach dem Rollback weitergegeben.

Dies hängt davon ab, ob die Datenbank über Transaktionen verfügt.

NB: Speichern und Löschen sind in Transaktionen verpackt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X