2010-08-20 8 views
2

J'ai 2 linq 2 instructions SQL Je voudrais être dans une transaction (le serveur SQL est distant, à l'extérieur des pare-feu, etc.) tous les autres travaux de communication, mais quand je enveloppe ces 2 déclarations dans un TransactionScope() avoir à configurer MSDTC ce que nous avons fait, mais il y a des problèmes de pare-feu (je pense) est-il un moyen plus simple?Transactions simples

les bases de ce que je veux faire bouillir à ceci: (les deux sont stockés procs sous le capot)

using (var transactionScope = new TransactionScope()) 
{ 
    Repository.DataContext.SubmitChanges(); 
    Repository.DataContext.spDoFinalStuff(tempID, ref finalId); 
    transactionScope.Complete(); 
} 

Quelle est la façon la plus simple pour y parvenir?

EDIT:
J'ai d'abord ceci: Le gestionnaire de transactions a désactivé son soutien pour les transactions à distance/réseau. (Exception de HRESULT: 0x8004D024) Sur nos serveurs j'ai suivi les instructions here pour corriger ceci. Cependant, les instructions ne semblent pas s'appliquer à Windows 7 (ma boîte de dev) voir mon commentaire sur la réponse ci-dessus. Après avoir corrigé le problème (sur les boîtes non win7) je reçois ceci: La transaction a déjà été implicitement ou explicitement validée ou annulée (Exception de HRESULT: 0x8004D00E) dont certains googling suggested peut être un problème de pare-feu.

EDIT
Je viens de découvrir la DB à distance est SQL 2000

Répondre

0

si 2 mises à jour sont envoyées à 2 base de données, .net classe transactoinScope besoin de l'aide de MSDTC pour coordonner les opérations. Serveur SQL 2005 ou version ultérieure, si deux mise à jour sont dans la même base de données, aucun MSDTC n'est impliqué.

MSDTC sont configurés dans le service de composant com +, choisissez le nom de votre ordinateur et sélectionnez les propriétés. En principe, vous devez sélectionner Aucune authentification.

le lien suivant pourrait aider

http://support.microsoft.com/kb/306843

http://blogs.msdn.com/b/distributedservices/archive/2008/11/12/troubleshooting-msdtc-issues-with-the-dtcping-tool.aspx

+0

ahhh Je viens de découvrir que le serveur distant utilise SQL 2000 – Myster

0

vous pouvez toujours créer une nouvelle procédure stockée qui exécute ces deux SPs dans sa propre transaction? Rapide et sale ...

0

TransactionScope est le chemin à parcourir si vous ne voulez pas vous tromper avec SQL. Je ne suis pas familier avec faire des transactions sur un pare-feu et avoir des problèmes cependant. Pouvez-vous publier les exceptions/erreurs que vous rencontrez?

Si cela vous cause vraiment des problèmes, vous pouvez créer une procédure stockée pour envelopper ces opérations et effectuer la transaction dans la procédure stockée encapsulée.

0

Lorsque vous ne devez gérer qu'une seule base de données au cours de la transaction, vous pouvez simplement créer et ouvrir un nouveau SqlConnection. Cela vous évite d'avoir à utiliser un TransactionScope. Voici un exemple:

using (var con = new SqlConnection("constr")) 
{ 
    con.Open(); 
    using (var tran = con.BeginTransaction()) 
    { 
     using (var context = new YourDataContext(con)) 
     { 
      // Do stuff 
      context.SubmitChanges(); 
      int generatedId = /* get this id */ 
      // Do stuff with id 

      context.SubmitChanges(); 
     } 
    } 
} 

Parce que vous utilisez un Repository, vous devrez créer le contexte sur le fond, mais l'idée est la même. Et n'oubliez pas de disposer de la transaction et de la connexion à la base de données.