Durch welche Servereigenschaft eskaliert TransactionScope zu MSDTC?

7

In unserer Anwendung verwenden wir TransactionScope. Wir möchten den MSDTC-Dienst nicht nutzen, da er viel langsamer ist als einfache Transaktionen.

using (var transactionScope = new TransactionScope())
{
  ...
  transactionScope.Complete();
}

Während wir mit der Testdatenbank verbunden sind, benötigen wir kein MSDTC, aber genau derselbe Code, der auf demselben Computer ausgeführt wird, eskaliert, um MSDTC zu verwenden, wenn eine Verbindung mit der Produktions- oder Entwicklungsdatenbank besteht.

Die Entwicklungsdatenbank ist nicht geclustert und keine benannte Instanz.

Alle sind SQL Server 2008 (10.50.2500) und die Verbindungszeichenfolgen sind bis auf die Hostnamen genau gleich.

Es scheint, dass es einen Unterschied in der Einrichtung der Datenbanken geben muss. Irgendwelche Ideen, was das sein könnte?

BEARBEITEN

Die Transaktion diente dazu, Einfügungen in zwei verschiedenen Tabellen zu schützen. Ich bemerkte, dass es auch zwei Anrufe gab, die zu zwei Auswahlen führten. Diese mussten nicht in der Transaktion enthalten sein, daher habe ich sie außerhalb der Transaktion verschoben. Der Bedarf an MSDTC verschwand dann in allen drei Datenbanken. Problem gelöst, aber ohne wirklich zu wissen, was es verursacht hat.

Jonas Elfström
quelle
Tritt dies auf, wenn Sie eine einzelne Verbindung oder mehrere haben? Wenn mehr als eine, sind sie unterschiedliche Verbindungszeichenfolgen?
In diesem Fall gibt es mehrere Verbindungen, die dieselbe Verbindungszeichenfolge verwenden. Ich muss testen, wie sich einzelne Verbindungstransaktionen verhalten.
Ist der Produktionsserver so eingestellt, dass er abwärtskompatibel mit SQL Server 2005 ist? Wenn ja, könnte dies das Problem sein, da 2005 ein Fehler auftrat, bei dem es zu einer Verteilung kam, wenn mehr als eine Verbindung Teil der Transaktion war.
"Kompatibilitätsstufe: SQL Server 2008 (100)" für beide.

Antworten:

5

Hier sind einige der Dinge, die Sie versuchen können, um es zum Laufen zu bringen:

  • Vergleichen Sie Enlist=falsein Ihren Verbindungszeichenfolgen
  • Vergleichen Sie MultipleActiveResultSets=truein Ihren Verbindungszeichenfolgen
  • Benutzerinstanzdatenbanken scheinen aus irgendeinem Grund anders zu funktionieren - wir konnten sie nicht konsistent mit ihnen arbeiten lassen - verwenden Sie ständig vollständige Datenbanken
  • Sie können dieselbe Verbindung wiederverwenden (schließen / erneut öffnen) oder mehr als eine Verbindung in einer Verbindung verwenden TransactionScope, aber Sie können nicht mehr als eine Verbindung gleichzeitig verwenden. Sie KÖNNEN jedoch eine ThreadStaticVerbindung aufrechterhalten und diese weitergeben (oder wie wir sie ThreadLocal<>in einer DB-Wrapper-Klasse verwenden) - dies löste ein Parallelitätsproblem für uns in ASP.NET, das zu einer unnötigen Eskalation führte
  • Machen Sie sich keine Sorgen, wenn Ihre Datenbank <2008 oder die Kompatibilitätsstufe <100 ist
  • Verwenden Sie bei der Verwendung von Verbindungszeichenfolgen nicht die ConnectionStringEigenschaft einer anderen Verbindung, um eine neue Verbindung zu erstellen. Diese entspricht möglicherweise nicht der ursprünglichen, was zu einer Eskalation führt
  • Halten Sie Ihre Verbindungen nur so lange offen, wie Sie möchten, und schließen Sie sie zum frühestmöglichen Zeitpunkt.

Sachen, die ich nützlich fand:

Enashnash
quelle
1

In diesem Fall gibt es mehrere Verbindungen, die dieselbe Verbindungszeichenfolge verwenden

Irrelevant. Zweite Verbindung = Weitergabe an MSDTC. Sie können nur nicht mehrere Verbindungen öffnen. Halten Sie sich an eine Verbindung und diese wird nicht an MSDTC weitergegeben. Öffnen Sie eine zweite Zeichenfolge - dieselbe Zeichenfolge, auch wenn die erste geschlossen ist - und sie muss sich ausbreiten, da sie die Verbindung zur neuen nicht neu zuweisen kann / kann. Das macht es zu 2 Konnektionen, was per Definition eine verteilte Transaktion ist.

TomTom
quelle
Das galt für SQL Server 2005, aber mir wurde gesagt, dass SQL Server 2008 dieses Problem gelöst hat. Leider funktioniert es nur auf einem von drei Servern. Obwohl es nur auf einem von drei Servern funktioniert, beweist es, dass Ihre Antwort falsch ist. petermeinl.wordpress.com/2011/03/13/…
Nun, es ist das einzige, das ich bisher habe und es gibt Unmengen ähnlicher Antworten in Google. Ich würde gerne hier als falsch erwiesen werden - macht das Verbindungsmanagement viel einfacher.
TomTom
Ich habe zwei Auswahlen außerhalb der Transaktion verschoben und nur die beiden Einfügungen (in getrennten Verbindungen) aufbewahrt. Jetzt funktioniert es auf allen drei Datenbankservern, ohne dass MSDTC erforderlich ist.