web-dev-qa-db-fra.com

Quelle propriété Server fabrique des transactions de transaction sur MSDTC?

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é.

7
Jonas Elfström

Voici certaines des choses que vous pouvez essayer de le faire fonctionner:

  • Comparez Enlist=false dans vos chaînes de connexion
  • Comparez MultipleActiveResultSets=true dans vos chaînes de connexion
  • Les bases de données d'instance d'utilisateur semblent fonctionner différemment pour une raison quelconque - nous ne pouvions pas le faire fonctionner de manière cohérente avec eux - utilisez toutes les bases de données complètes tout le temps
  • Vous pouvez réutiliser la même connexion (fermer/rouvrir) ou utiliser plus d'une connexion dans un TransactionScope, 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 inutile
  • Ne vous inquiétez pas si votre DB <2008 ou si le niveau de compatibilité <100
  • Lorsque vous utilisez des chaînes de connexion, n'utilisez pas la propriété ConnectionString d'une autre connexion pour créer votre nouvelle connexion - il peut ne pas être identique à celui d'origine, ce qui entraînera une escalade
  • Gardez vos connexions ouvertes uniquement aussi longtemps que vous en avez besoin, fermez-les à votre première occasion.

Des choses que j'ai trouvées utiles:

5
enashnash

Dans 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.

1
TomTom