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 :

Transaction dans un nTier Layer


Sujet :

Accès aux données

  1. #1
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut Transaction dans un nTier Layer
    Salut a tout le monde!

    j'ai actuellement des Problemes pour implementer une transaction dans mon architecture nTier.

    Mon Application utilise WCF(wsdualhttpbinding) et EF.

    Alors j'ai 3 niveau dans mon architecture :
    - Presentation Tier
    - Logic Tier
    - Data Tier

    premiere Question :

    Si je veux faire des Transactions dans quel niveau de mon Architecture dois je le faire? Au niveau de la Logic ou du Data Tier ?

    Merci

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Généralement, c'est au niveau du tiers de logique. C'est en effet ici que se décide si la transaction est valable (et donc peut être commitée) ou si un rollback est nécessaire: c'est une méthode business qui doit être transactionelle.

    Il arrive cependant des cas ou c'est juste l'acces aux données qui doit être transactionnel et que chaque accès est indépendant.

  3. #3
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut
    @Nathanael

    Merci c'etais aussi ma pensee...

    Mais voila j'ai encore une difficulte a execute mes transactions au niveau de mon tier logique ; un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    using (TransactionScope thisScope = new TransactionScope())
    {
       if (Transaction.Current.TransactionInformation.DistributedIdentifier == Guid.Empty)
       {
           using (var scope = new TransactionScope(TransactionScopeOption.Required))
           {
               try
               {
                  //ici j'ai 2 Operations
                  //1.
                  //vdm c'est mon Service Client
                  if( ... )
                  {
                       localfile = vdm.saveData(filename)  // je sauvegarde un fichier
                       bool status = vdm.saveDevice(devicename); //je sauvegarde un seul device
                  }
    
                  //2.
                  foreach( ... )
                  {
                      bool status2 = vdm.saveDevice( devicename ); // si il y a plus d'un device
                  }
               
                  scope.Complete();
               }
               catch (FileNotFoundException ex)
               {
                                System.Windows.MessageBox.Show(ex.Message);
               }
                finally
                {
                    scope.Dispose();                           
               }
            }
       }
    }
    Alors je recois un message d'erreur qui dis :
    La transaction a été avortee. (Exception from HRESULT: 0x8004D019)
    j'aimerais bien avoir de l'aide pour corriger ce probleme!!

    Merci

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Oula y'a deux transactions qui se chevauchent là!
    Ca devrait suffir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    using (var scope = new TransactionScope(TransactionScopeOption.Required))
           {
               try
               {
                  //ici j'ai 2 Operations
                  //1.
                  //vdm c'est mon Service Client
                  if( ... )
                  {
                       localfile = vdm.saveData(filename)  // je sauvegarde un fichier
                       bool status = vdm.saveDevice(devicename); //je sauvegarde un seul device
                  }
     
                  //2.
                  foreach( ... )
                  {
                      bool status2 = vdm.saveDevice( devicename ); // si il y a plus d'un device
                  }
     
                  scope.Complete();
               }
               catch (FileNotFoundException ex)
               {
                                System.Windows.MessageBox.Show(ex.Message);
               }
            }
    Sinon, faudrait voir plus en détails l'erreur, car là on peut pas faire grand chose avec!

    Edit: le finally ne sert à rien, il y est déjà avec le using

  5. #5
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut


    Beh! j'ai plus besoin d'envoyer l'erreur en Details, il n'y en a plus... tu avais bien raison.

    Bon une derniere Question :

    - Pourquoi les Query sont visibles dans la base de donnees avant le scope.complete() ?

    Je croyais que les enregistrements dans la bdd ne s'effectuais qu'apres que la methode scope.complete() soit appelee. ??

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Alors oui et non. Normalement, si ca marche bien, tu vois effectivement les requêtes arriver et etre executée par le profiler. Mais tu ne devrais pas voir l'impact de celle ci depuis une autre transaction!
    Sinon ca vient peut être de la facon dont tu te connectes à la base.

  7. #7
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut
    En fait ma connection s'execute dans mon model.context.tt ( qui est genere dans EF a partir du code generation d'un modele .edmx ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    public partial class VdmEntityConn : ObjectContext
        {
            public const string ConnectionString = "name=VdmEntityConn";
            public const string ContainerName = "VdmEntityConn";
     
            #region Constructors
     
            public VdmEntityConn()
                : base(ConnectionString, ContainerName)
            {
                this.ContextOptions.LazyLoadingEnabled = false;
            }
     
            public VdmEntityConn(string connectionString)
                : base(connectionString, ContainerName)
            {
                this.ContextOptions.LazyLoadingEnabled = false;
            }
     
            public VdmEntityConn(EntityConnection connection)
                : base(connection, ContainerName)
            {
                this.ContextOptions.LazyLoadingEnabled = false;
            }
    Et ca veux dire quoi "je ne devrais pas voir l'impact depuis une autre transaction" ?

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Par exemple si ta transaction insère une ligne, tu ne devrais pas voir la ligne en base tant que la transaction n'est pas commitée.

  9. #9
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut
    Okay je comprends! serait il possible que chez moi ce n'est pas le cas parce que je n'effectue aucun : context.saveChanges() ??

    Dans mon service c'est possible de faire cela! mais comme tu peux le constater je fais les transactions depuis mes modeles.

    Est ce important ou pas de faire des saveChanges() ??

    Merci

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

Discussions similaires

  1. Utilisation d'une transaction dans une proc
    Par Sickfrid dans le forum DB2
    Réponses: 1
    Dernier message: 08/03/2007, 11h43
  2. demarrer une transaction dans une procedure stockee
    Par richard038 dans le forum SQL
    Réponses: 1
    Dernier message: 04/11/2005, 13h09
  3. Transaction dans une fonction
    Par etiennegaloup dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 01/11/2005, 16h44
  4. [transaction dans une fonction]
    Par viny dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 24/08/2005, 21h33
  5. [plpgsql] transaction dans les fonctions ?
    Par hpghost dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 27/06/2004, 16h56

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