IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Accès aux données Discussion :

Comment gérer les transactions convenablement ?


Sujet :

Accès aux données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Comment gérer les transactions convenablement ?
    Bonjour,

    En vue d'un nouveau projet qui va m'être confié, une question me turlupine : dans les architectures classiques 3 tiers, je ne vois pas comment gérer correctement mes transactions dans mon futur code.

    Je m'explique. Prenons le cas classique d'une université : un élève s'inscrit et il faut l'ajouter dans une classe et à l'internat.
    Je vais donc faire :

    - Une classe EleveDAO
    - Une classe service Eleve

    - Une classe ClasseDAO
    - une classe service Classe

    - Une classe InternatDAO
    - une classe service Internat

    Je continue J'ai maintenant besoin de faire une classe Inscription, dans laquelle je fais une méthode "inscrire" qui fait par exemple (le code ci-dessous est mauvais, mais c'est pour l'exemple )
    - Eleve.Ajouter() qui appelle EleveDAO.Ajouter(me)
    - Classe.AjouterEleve() qui appelle ClasseDAO.AjouterEleve(...)
    - Internat.AjouterPensionnaire qui appelle InternatDAO.AjouterPensionnaire(..)

    Bien entendu, si une des ces méthodes ajouter échoue, il faut faire un rollback. Il faudrait donc que ce soit les procédures de la couche "service" qui gèrent les transactions. Mais :
    - il faut que mes classes service restent indépendantes de la technologie utilisée par la couche DAO.
    - si chacune des classes services gèrent leurs propres transactions, il faudrait dans chacune d'elles, avant de démarrer une transaction, vérifier qu'aucune n'est en cours.

    Comment faire donc pour faire propre et simple ? Utiliser des outils fournis par nHibernate ? J'ai fouillé partout sur le net sans trouver de réponse claire à mon problème.

    Merci pour vos futures lumières

  2. #2
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Salut,

    bon, je ne vais pas remettre le couvert, mais déjà, j'aimerais que tu clarifies ce que tu entends par MVC

    Citation Envoyé par Dufok Voir le message
    Bien entendu, si une des ces méthodes ajouter échoue, il faut faire un rollback. Il faudrait donc que ce soit les procédures de la couche "service" qui gèrent les transactions.
    Pas forcément, dans l'absolu, tu peux aussi considérer que tu as une méthode "Inscrire", qui descends directement dans la couche DAO, et qui regroupe la partie transaction.

    Si tu veux le gérer au niveau service, le plus simple est d'utiliser TransactionScope, qui devrait faire l'affaire.

    Normalement, ca doit fonctionner avec NHibernate (ca marche bien avec Subsonic, alors j'espère bien que NHibernate le fait aussi )

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Merci !

    Tu as répondu trop vite Je me suis rendu compte de ma boulette en postant mon message hier soir, j'ai corrigé par "3 tiers" à la place de MVC

    Je viens de regarder vite fait la classe TransactionScope. Ca a l'air plutôt pas mal

    Avec un tel outil, vaut-il mieux mettre la gestion des transactions au niveau DAO ou au niveau service ?

  4. #4
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Citation Envoyé par Dufok Voir le message
    Avec un tel outil, vaut-il mieux mettre la gestion des transactions au niveau DAO ou au niveau service ?
    Réponse classique, "ca dépends"

    En général, pour les transactions, j'aime bien les laisser dans la partie DAO, vu qu'une transaction, c'est un opération de bases de données, après tout...

    Le problème, c'est que si tu veux prévoir un peu "pour l'avenir", il faut prendre en compte le plus simple à utiliser pour la maintenance, et dans ce cas la, le plus simple est d'utiliser TransactionScope directement dans la couche Service...mais ca a tendance à me brosser dans le mauvais sens du poil (ceci dit, c'est probablement des vieux restes de l'époque ou on faisait du "tout proc stoc")

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Merci, je vais étudier tout ça !

    L'époque "tout proc stock" je n'ai pas connu, je découvre juste : on m'a confié la maintenance d'un vieux projet rempli de ce genre de trucs

  6. #6
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Salut,

    A un niveau plus conceptuel, le pattern Unit of Work proposé par Martin Fowler semble répondre à tes besoins.

    Il peut être implémenté à l'aide de TransactionScope et découplé de la DAL (persistence ignorance).

    http://msdn.microsoft.com/en-us/magazine/dd882510.aspx
    http://www.geekzone.fr/ipb/index.php...dpost&p=724327
    http://sergeyshishkin.spaces.live.co...D63F!265.entry

  7. #7
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Citation Envoyé par Maximilian Voir le message
    A un niveau plus conceptuel, le pattern Unit of Work proposé par Martin Fowler semble répondre à tes besoins.

    Il peut être implémenté à l'aide de TransactionScope et découplé de la DAL (persistence ignorance).
    NHibernate est justement basé sur Unit of Work

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 203
    Points
    2 203
    Par défaut
    Citation Envoyé par Philippe Vialatte Voir le message
    NHibernate est justement basé sur Unit of Work
    Pas trop justement, j'ai plutôt l'impression qu'il cherche un active record avec une transaction propagée.

    Maintenant imaginons le cas suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    using (ISession s=Dal.GetSession())
    {
     
         s.SaveOrUpdate(_eleve);
     
    }
    C'est suffisant : chaque ISession détachée par la session factory de Nh sont des unit of works.

    Après on peut encore ajouter des transactions dessus, mais ça n'est pas très utile!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [EJB3.1] Transaction rollback : Comment gérer les Exceptions ?
    Par piemur2000 dans le forum Glassfish et Payara
    Réponses: 1
    Dernier message: 09/02/2012, 09h33
  2. Comment et où gérer les transactions ?
    Par brice01 dans le forum Autres
    Réponses: 6
    Dernier message: 12/11/2009, 22h26
  3. Où gérer les transactions avec Firebird ?
    Par DMO dans le forum Débuter
    Réponses: 2
    Dernier message: 26/04/2005, 09h21
  4. Comment gérer les valeur Nulles dans une requête ?
    Par sondo dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/03/2005, 11h02
  5. Comment gérer les espaces blancs?
    Par Lambo dans le forum XML/XSL et SOAP
    Réponses: 10
    Dernier message: 16/05/2003, 09h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo