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 sur Requêtes Entities et Requêtes SQL pures


Sujet :

Accès aux données

  1. #1
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut Transaction sur Requêtes Entities et Requêtes SQL pures
    Bonjour,

    j'écris actuellement un code (Procédure stockée), qui lit en Linq Entities des données d'une base A, et va écrire dans une base B en LinqEntities et en Requêtes SQL classiques (avec SQLConnexion, SQLCommand et tout le tralala).

    Voulant sécuriser la transaction de migration de données, j'avais encapsulé mes appels dans un TransactionScope, de telle manière :

    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
     
    Context context1 = new Context(ConnexionLocale);
    Context context2 = new Context(ConnexionDistante);
    using(TransactionScope tscope = new TransactionScope())
    {
          SQLConnection cnx = new SQLConnection(ConnexionDistante2);
         //Lecture avec context1
         //Ecriture avec context2
         //Requete SQL INSERT avec cnx
     
         context1.saveChanges();
         context2.saveChanges();
         cnx.Close();
         tscope.Complete();
    }
    L'appel au premier SaveChanges me lève une exception, comme quoi la transactoion a déjà été commit ou rollback, j'ai donc enlevé le transactionScope, mais maintenant si un souci avec la requête Linq se produit, mes données traitées avec cnx persistent, et je perds mon intégrité de données.

    Comment puis-je gérer correctement cette histoire de transaction ?

    Edit : message d'erreur complet
    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
    System.Data.EntityException: The underlying provider failed on Open. ---> System.Transactions.TransactionException: The transaction has already been implicitly or explicitly committed or aborted. ---> System.Runtime.InteropServices.COMException: La transaction a déjà été validée ou annulée de manière implicite ou explicite (Exception de HRESULT : 0x8004D00E)
    System.Runtime.InteropServices.COMException: 
       at System.Transactions.Oletx.ITransactionShim.Export(UInt32 whereaboutsSize, Byte[] whereabouts, Int32& cookieIndex, UInt32& cookieSize, CoTaskMemHandle& cookieBuffer)
       at System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts)
    System.Transactions.TransactionException: 
       at System.Transactions.Oletx.OletxTransactionManager.ProxyException(COMException comException)
       at System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts)
       at System.Data.SqlClient.SqlInternalConnection.GetTransactionCookie(Transaction transaction, Byte[] whereAbouts)
       at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
       at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
       at System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
       at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
       at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
       at System.Data.ProviderBase.DbConnectionClosed.OpenConnec
    	...
    System.Data.EntityException: 
       at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionO...
    The underlying provider failed on Open == il ne peut pas instancier car une transaction serait ouverte ? Y aurait-il un moyen de transmettre le scope à l'entity ?

    Merci

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    J'ai fini par créer un CommitedTransaction,
    j'enlist la connexion sql dessus, puis je crée un Connexion.BeginTransaction() par connexion EF.

    A la fin :
    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
     
                    try
                    {
                        sDistant.SaveChanges(false);
                        s.SaveChanges(false);
     
                        sDistant.AcceptAllChanges();
                        s.AcceptAllChanges();
     
                        tx2.Commit();
                        txEF2.Commit();
                        txEF1.Commit();
                    }
                    catch (Exception e)
                    {
                        tx2.Rollback();
                        txEF1.Rollback();
                        txEF2.Rollback();
     
                        throw e;
                    }
    Avec une exception générée à divers endroits pour tester, ça marche bien, j'ai mes commit/rollback

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

Discussions similaires

  1. Aide sur une demande de requête au niveau de SQL Server
    Par Msysteme dans le forum Langage SQL
    Réponses: 1
    Dernier message: 08/04/2013, 23h01
  2. Requête d'ajout en sql sur access
    Par Malley dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/11/2009, 12h30
  3. avis sur génération d'une requête INSERT (sql)
    Par MatthieuQ dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/03/2009, 10h17
  4. [MySQL] modification de son compte sur mon site avec requête sql
    Par cuisto44000 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 01/07/2008, 17h56
  5. Requête en SQL pure sous Access2002
    Par Chtulus dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 17/04/2008, 13h00

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