Question

Est-il vrai que le verbe reposant tout entier fait l’objet d’une seule transaction englobante? Autrement dit, si je génère une erreur dans la validation ou les rappels à tout moment du traitement d'une opération UPDATE, DELETE ou CREATE, chaque opération de base de données que j'ai pu effectuer dans des rappels précédents est-elle également annulée? En résumé, le fait de générer une erreur lors d’un rappel ou d’une validation fait-il en sorte que la base de données ne subit aucun changement pour cette action de verbe?

Était-ce utile?

La solution

  

Est-il vrai que le verbe reposant tout entier fait l’objet d’une seule transaction englobante?

Non

  

si je déclenche une erreur dans la validation ou les rappels à un moment quelconque du traitement d'une opération UPDATE, DELETE ou CREATE, chaque opération de base de données que j'ai pu effectuer dans des rappels précédents est-elle également annulée?

Non.

  

le fait de générer une erreur lors d'un rappel ou d'une validation fait-il en sorte qu'aucun changement ne survienne dans la base de données pour cette action de verbe?

Non.

Si vous souhaitez ce comportement, vous pouvez soit créer explicitement des transactions dans votre contrôleur (voir les exemples fournis par d'autres utilisateurs), soit utiliser un around_filter pour associer le comportement à toutes vos actions reposantes.

Autres conseils

Par défaut, aucun code de base de données n'est écrit dans une transaction, vous devez lui indiquer de le faire dans le code.

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

Utilisation de la commande #create! Les méthodes essaieront de sauvegarder l’enregistrement et si elles échouent, elles lèveront une exception qui annulera tout code déjà exécuté dans le bloc de transaction.

Si vous ne récupérez pas l'action, vous serez redirigé (je pense) vers un fichier 405.html de votre répertoire public, le cas échéant.

Certaines méthodes (créer, détruire) vont immédiatement dans la base de données. Les transactions sont effectuées à l'aide de la méthode de transaction sur les classes dérivées d'ActiveRecord, comme suit:

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

(Cet exemple concerne plusieurs bases de données. Pour une base de données unique, une seule transaction suffit.)

Vous pouvez ensuite annuler ces transactions et les exceptions levées dans la transaction sont propagées après la restauration.

Cela dépend de la base de données ayant des transactions.

NB: les opérations de sauvegarde et de destruction sont encapsulées dans les transactions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top