2010-04-23 5 views
0

J'ai un service Windows personnalisé que j'ai récemment mis à niveau pour utiliser TransactionScope pour les transactions imbriquées. Cela a bien fonctionné localement sur ma vieille machine de développement (XP sp3) et sur un serveur de test (Server 2003). Cependant, il échoue sur ma nouvelle machine Windows 7 ainsi que sur 2008 Server. Il ciblait le cadre 2.0; J'ai essayé de cibler 3.5 à la place, mais ça échoue toujours.Problèmes de transaction imbriqués dans un service Windows personnalisé

La partie étrange est vraiment dans la façon dont elle échoue; aucune exception n'est levée. Le service lui-même expire simplement. J'ai ajouté le code de traçage, et il échoue lors de l'ouverture de la connexion pour la recherche de base de données # 2 ci-dessous. J'ai également activé le traçage pour System.Transactions; il coupe littéralement à mi-chemin pendant l'écriture du bloc pour la connexion échouée.

Nous avons exécuté une trace SQL, mais seule la première recherche apparaît. Je mets des traces de code, et il arrive à la trace de la ligne avant la deuxième recherche, mais rien après. J'ai eu la même expérience frappant deux serveurs SQL différents (les deux sont SQL 2005 s'exécutant sur le serveur 2003). La chaîne de connexion utilise un compte SQL (pas l'intégration de Windows). Dans ce cas, toutes les connexions sont dirigées contre la même base de données, mais compte tenu de la nature du code, il est transmis à MSDTC.

est ici la structure de code de base:

TransactionOptions options = new TransactionOptions(); 
options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; 
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, options)) 
{ 
// Database lookup #1 

TransactionOptions options = new TransactionOptions(); 
options.IsolationLevel = Transaction.Current != null ? Transaction.Current.IsolationLevel : System.Transactions.IsolationLevel.ReadCommitted; 
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options)) 
{ 
    // Database lookup #2; fails on connection.Open() 
    // Database save (never reached) 
    scope.Complete();<br/> 
} 
scope.Complete();<br/> 
} 

Mon pare-feu local est désactivé. Le service s'exécute normalement en utilisant le service réseau, mais j'ai également essayé mon compte d'utilisateur (mêmes résultats). En résumé, j'utilise largement la même technique générale dans mes applications Web et je n'ai rencontré aucun problème. J'ai sorti le code et l'ai exécuté correctement dans une application Windows Form locale. Si quelqu'un a des idées de débogage supplémentaires (ou, mieux encore, des solutions), j'aimerais les entendre.

+0

La base de données est-elle la même? Est/était-il sur la même machine? Tenez compte des problèmes de distribution des transactions (ils nécessitent que MSTDC soit actif et configuré). Mes 2 cents. –

+0

Le même problème se produit lorsque vous ciblez différents serveurs de base de données (SQL 2005 sur Windows Server 2003). MSDTC est certainement impliqué (comme il semble qu'il a des problèmes en essayant d'enrôler le deuxième appel SQL). Pourquoi cela fonctionne en dehors d'un service Windows (ou dans un service sur Server 2003) me dépasse. – pdwetz

+0

Pouvez-vous poster un morceau de code? Le moteur du serveur est-il toujours le même? Sql 2005 ou 2008? Quel type d'authentification utilisez-vous, intégré ou "old style (sa)"? –

Répondre

0

Entourez vos recherches de base de données avec un nouvel objet de transaction et utilisez l'option de suppression. Le select verrouille les enregistrements dans sql2005 même avec l'indicateur nolock.

Questions connexes