Forum: Rails France Rails et transactionnel

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
50bfd02edf387389b4bcbe121075af60?d=identicon&s=25 Samuel DECHOMETS (Guest)
on 2007-03-15 16:45
(Received via mailing list)
Bonjour à tous,

Le contexte est le suivant :
- j'ai un model Person qui est associé en has_many à Pets et Cars
- j'ai un formulaire unique permettant de saisir les données "Person"
ainsi
que les données associées "Pets" et "Cars"
- dans mon controller pour l'update  :
       person = Person.find(params[:id])
       pets = person.pets << Pet.new...
       cars = person.cars << Car.new...
       person.save

Le problème maintenant :
Lors du save, différents contrôle de validation sont effectués sur les
différents objets. Si pets renvoi une erreur, person n'est pas
sauvegardé
mais cars oui !

La question :
Y a-t-il moyen de faire un rollback général sur les transactions liées
au
save lorsqu'une erreur survient ?

D'avance merci

Sam
Bef7ff8a0537495a1876ffebdc9f8e51?d=identicon&s=25 Lionel Bouton (Guest)
on 2007-03-15 17:15
(Received via mailing list)
Samuel DECHOMETS wrote the following on 15.03.2007 16:43 :
>        person.save
>
> Le problème maintenant :
> Lors du save, différents contrôle de validation sont effectués sur les
> différents objets. Si pets renvoi une erreur, person n'est pas
> sauvegardé mais cars oui !
>
> La question :
> Y a-t-il moyen de faire un rollback général sur les transactions liées
> au save lorsqu'une erreur survient ?
>

Person.transaction do
    person = Person.find(params[:id])
    pets = person.pets << Pet.new...
    cars = person.cars << Car.new...
    person.save
end
Bef7ff8a0537495a1876ffebdc9f8e51?d=identicon&s=25 Lionel Bouton (Guest)
on 2007-03-15 17:25
(Received via mailing list)
Lionel Bouton wrote the following on 15.03.2007 17:14 :
> Person.transaction do
>     person = Person.find(params[:id])
>     pets = person.pets << Pet.new...
>     cars = person.cars << Car.new...
>     person.save
>

oups, il faut faire person.save! (pour faire un rollback si ça se passe
mal).
50bfd02edf387389b4bcbe121075af60?d=identicon&s=25 Samuel DECHOMETS (Guest)
on 2007-03-15 17:30
(Received via mailing list)
Mea culpa, j'ai mal retranscrit mon code, j'utilise bel et bien le save!
mais le rollback s'effectue seulement sur "person", pas sur "cars"...

2007/3/15, Lionel Bouton <lionel-subscription@bouton.name>:
7c1cf44366644d1928a05ebe29519dee?d=identicon&s=25 Yann Strass (strass)
on 2007-03-15 17:44
(Received via mailing list)
Je suis aussi en train d'étudier les transactions pour des raisons de
perfs (d'après
http://www.antoniocangiano.com/articles/2007/02/10...
ça devrait jouer), et, AMHA, le système de transaction de Rails se
faisant au niveau objet, quand tu écris "Person.transaction", la
transaction ne sera valable que pour les modèles de type Person. Comme
dit, je peux me tromper, mais je le vois bien comme ça.

++

yk

Samuel DECHOMETS a écrit :
50bfd02edf387389b4bcbe121075af60?d=identicon&s=25 Samuel DECHOMETS (Guest)
on 2007-03-15 18:08
(Received via mailing list)
J'ai essayé :

ActiveRecord::Base.connection.transaction do

Mais c pas mieux (qui ne tente rien n'a rien !).

Dans les logs j'ai bien un rollback, mais la requete d'insert de "Cars"
est
"entourée" d'un begin-commit, quand le rollback s'applique, l'insert de
"cars" a déjà été commité. Y'a pas moyen de désactiver le begin commit
automatique sur les requêtes de mise à jour ?

Sam

Le 15/03/07, Yann Klis <strass@strasslab.net> a écrit :
Bef7ff8a0537495a1876ffebdc9f8e51?d=identicon&s=25 Lionel Bouton (Guest)
on 2007-03-15 18:36
(Received via mailing list)
Yann Klis wrote the following on 15.03.2007 17:43 :
> Je suis aussi en train d'étudier les transactions pour des raisons de
> perfs (d'après
> http://www.antoniocangiano.com/articles/2007/02/10...
> ça devrait jouer), et, AMHA, le système de transaction de Rails se
> faisant au niveau objet, quand tu écris "Person.transaction", la
> transaction ne sera valable que pour les modèles de type Person.

Non, non, pour toutes les manipulations sur les objets utilisant la même
connexion à la base, donc par défaut tous les objects ActiveRecord::Base
de ton application. Une remarque néanmoins : je pense que si tu utilises
un SGBD qui ne supporte pas les transactions (MySQL avec MyISAM par
exemple), elles sont automatiquement désactivées et en plus
silencieusement, donc tout se passe en pratique comme si tu n'avais pas
de transaction.

Lionel
669e19951b848d1b0dac78655e34c2a4?d=identicon&s=25 Simon Pasquier (Guest)
on 2007-03-15 23:06
(Received via mailing list)
Salut,

J'ai pas le temps de me replonger la-dedans en détail mais essaie ce
plugin: http://rubyforge.org/projects/arnesttransacts/
Il est possible que çà règle ton souci (sans garantie!).

Simon
50bfd02edf387389b4bcbe121075af60?d=identicon&s=25 Samuel DECHOMETS (Guest)
on 2007-03-16 08:38
(Received via mailing list)
La boulette ! Effectivement, mes tables étaient en MyIsam. Je les ai
passées
en InnoDb et ça fonctionne...

Merci à tous

Sam

Le 15/03/07, Lionel Bouton <lionel-subscription@bouton.name> a écrit :
27c126b69ee080108f979b1e8f610d65?d=identicon&s=25 Nicolas Paton (Guest)
on 2007-03-20 18:11
(Received via mailing list)
Salut Sam,

Juste pour info et pour ne pas être pris de court, les transactions
dans rails sont deprecated et seront supprimé en v2.0 :
http://dev.rubyonrails.org/changeset/6439?new_path=trunk

à+
np

Le 16 mars 07 à 08:36, Samuel DECHOMETS a écrit :
Bef7ff8a0537495a1876ffebdc9f8e51?d=identicon&s=25 Lionel Bouton (Guest)
on 2007-03-20 18:19
(Received via mailing list)
Nicolas Paton wrote the following on 20.03.2007 18:09 :
> Salut Sam,
>
> Juste pour info et pour ne pas être pris de court, les transactions
> dans rails sont deprecated et seront supprimé en v2.0 :
> http://dev.rubyonrails.org/changeset/6439?new_path=trunk
>

Euh, les transactions sur objet. Le jour où ils suppriment les
transactions totalement, je forke...
This topic is locked and can not be replied to.