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.
quelle
Antworten:
Hier sind einige der Dinge, die Sie versuchen können, um es zum Laufen zu bringen:
Enlist=false
in Ihren VerbindungszeichenfolgenMultipleActiveResultSets=true
in Ihren VerbindungszeichenfolgenTransactionScope
, aber Sie können nicht mehr als eine Verbindung gleichzeitig verwenden. Sie KÖNNEN jedoch eineThreadStatic
Verbindung aufrechterhalten und diese weitergeben (oder wie wir sieThreadLocal<>
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ührteConnectionString
Eigenschaft einer anderen Verbindung, um eine neue Verbindung zu erstellen. Diese entspricht möglicherweise nicht der ursprünglichen, was zu einer Eskalation führtSachen, die ich nützlich fand:
ConnectionScope
Klasse gab mir einige Ideen: http://blogs.msdn.com/b/dataaccess/archive/2006/02/14/532026.aspxTransactionScope
als den Standard-Ctor! http://blogs.msdn.com/b/dbrowne/archive/2010/06/03/using-new-transactionscope-considered-harmful.aspxquelle
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.
quelle