Problème:
Une application .NET en utilisant TransactionScope
présente un comportement incohérent concernant l'escalade de MSDTC. Sur certaines machines de développeur, la transaction s'intensifie automatiquement au coordinateur de transaction distribué Microsoft (MSDTC), nécessitant l'activation de MSDTC. Sur d'autres, le même code fonctionne correctement sans msdtc.
Contexte:
TransactionScope
gère l'accès aux données dans une transaction. TransactionScope
. La deuxième tentative de connexion déclenche l'escalade MSDTC sur les systèmes affectés. Investigation:
Les hypothèses initiales sur les écarts de version SQL Server (2005 contre 2008) se sont révélées incorrectes. La cause profonde réside dans les limites de SQL Server 2005: elle ne prend pas en charge plusieurs connexions dans un seul TransactionScope
, quelle que soit leur séquence d'ouverture. Tenter une deuxième connexion oblige l'escalade. SQL Server 2008, inversement, permet à plusieurs connexions dans un TransactionScope
, à condition qu'ils ne soient pas simultanément ouverts. La fermeture et la réouverture prématurées de la connexion, potentiellement grâce à la mise en commun des connexions et aux couches d'accès aux données (comme SqlTableAdapter
), peuvent également déclencher l'escalade dans SQL Server 2005.
Résolution:
Pour SQL Server 2005, la maintenance d'une connexion ouverte unique à l'échelle mondiale tout au long de la transaction empêche l'escalade MSDTC. Cependant, cela s'écarte des meilleures pratiques préconisant une gestion efficace des connexions (ouverture et fermeture au besoin). La mise à niveau vers SQL Server 2008 ou version ultérieure est la solution recommandée pour éviter cette limitation et maintenir les meilleures pratiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!