Dans notre application, nous utilisons des transactions de transaction. Nous visons à ne pas utiliser le service MSDTC car il est beaucoup plus lent que les transactions légères.
using (var transactionScope = new TransactionScope())
{
...
transactionScope.Complete();
}
Lorsqu'il est connecté à la base de données de test, nous n'avons pas besoin de MSDTC, mais le même code exact, exécuté sur la même machine, dépend de l'utilisation de MSDTC lorsqu'il est connecté à la base de données de production ou de développement.
La base de données de développement n'est pas regroupée et n'est pas une instance nommée.
Tous sont SQL Server 2008 (10.50.2500) et les chaînes de connexion sont exactement les mêmes sauf pour les noms d'hôte.
Il semble qu'il y ait une différence dans la configuration des bases de données. Des idées sur ce que cela pourrait être?
ÉDITER
La transaction était là pour protéger les inserts dans deux tables différentes. J'ai remarqué qu'il y avait aussi deux appels qui ont entraîné deux éléments sélectionnés. Il n'était pas nécessaire que cela soit dans la transaction, je les ai déplacés en dehors de cela. La nécessité pour MSDTC a ensuite disparu dans les trois bases de données. problème résolu mais sans vraiment savoir ce qui l'a causé.
Voici certaines des choses que vous pouvez essayer de le faire fonctionner:
Enlist=false
dans vos chaînes de connexionMultipleActiveResultSets=true
dans vos chaînes de connexionTransactionScope
, mais vous ne pouvez pas utiliser plus d'une connexion en même temps. Vous pouvez toutefois conserver une connexion ThreadStatic
et passer cela autour (ou, comme nous l'avons fait, utilisez ThreadLocal<>
Dans une classe d'emballage DB) - Cela a résolu un problème de simultanéité pour nous dans ASP.NET qui causait une escalade inutileConnectionString
d'une autre connexion pour créer votre nouvelle connexion - il peut ne pas être identique à celui d'origine, ce qui entraînera une escaladeDes choses que j'ai trouvées utiles:
ConnectionScope
m'a donné quelques idées: http://blogs.msdn.com/b/dataaccess/archive/2006/02/14/532026.aspxTransactionScope
que le CTOR par défaut! http://blogs.msdn.com/b/dbrowne/archive/2010/06/03/Undre-New-TransactionsCope-Conseded-harmful.aspxDans ce cas, il existe plusieurs connexions à l'aide de la même chaîne de connexion
Hors du sujet. Deuxième connexion = propagation à MSDTC. Tout ce que vous pouvez faire n'est pas ouvert plusieurs connexions. Collez sur NE Connection et il ne se propagera pas à MSDTC. Ouvrez une seconde - même chaîne, même si le premier est fermé - et il doit se propager comme il ne peut pas/ne réagisse pas la concutence à la nouvelle. Cela en fait 2 contacts par définition une transaction distribuée.