2009-04-27 11 views
34

Ich versuche TransactionScope zu verwenden, behalte aber die Ausnahme unten. Die App läuft auf einem anderen Rechner als die Datenbank, wenn das wichtig ist. Ich verwende Sql Server 2005.Wie verwende ich TransactionScope in C#?

"Netzwerkzugriff für Distributed Transaction Manager (MSDTC) wurde deaktiviert. Bitte aktivieren Sie DTC für den Netzwerkzugriff in der Sicherheitskonfiguration für MSDTC mit dem Component Services-Verwaltungstool."

using (TransactionScope tsTransScope = new TransactionScope()) 
{ 
    //Do stuff here 
    tsTransScope.Complete(); 
} 

bearbeiten

Ich habe einige chagnes auf dem Feedback basiert. Jetzt bin ich diesen Fehler:

{"Error HRESULT E_FAIL has been returned from a call to a COM component."} 
{"Communication with the underlying transaction manager has failed."} 

Lösung Ich denke, die Antwort akzeptiert die anfängliche Problem behoben war ich immer. Der zweite Fehler scheint spezifisch für das Entity-Framework zu sein. Ich werde eine andere Frage dafür stellen.

Hier sind die Eigenschaften auf dem Client: Client http://www.portnine.com/data/images/Misc/client.jpg

Hier sind die Eigenschaften auf dem Server:

Server http://www.portnine.com/data/images/Misc/server.jpg

+0

NotDan hast du immer noch die Bilder, die du verlinkt hast? Wenn es so wäre, wäre es toll, sie neu zu posten, um die Tatsache zu beheben, dass sie aktuell gebrochene Bildreferenzen sind. – ahsteele

Antwort

31

Sie müssen den Netzwerk-DTC-Zugriff wie in dieser Microsoft TechNet Article beschrieben aktivieren. Diese Änderung muss möglicherweise sowohl auf dem Datenbankserver als auch auf dem Anwendungsserver vorgenommen werden. Oftmals ist DTC bereits auf einem Datenbankserver aktiviert, so dass ich zuerst auf den Anwendungsserver schauen würde.

Hier ist ein Screenshot von dem, was wir verwenden, mit Ausnahme der „Allow Remote Administration“ Option: Security Configuration Screenshot

ich in die HRESULT E_Fail Problem ausgeführt haben nicht Sie jetzt haben, werden aber dieser Artikel auf XP SP2 and transactions dieses interessante hatte Vorschlag:

Another configuration setting that you need to be aware (although I consider it to be an uncommon scenario) is RestrictRemoteClients registry key. If the value of this key is set to 2 (RPC_RESTRICT_REMOTE_CLIENT_HIGH) then MSDTC network transactions will not be able to work properly. MSDTC supports only RPC_RESTRICT_REMOTE_CLIENT_NONE (0) and RPC_RESTRICT_REMOTE_CLIENT_DEFAULT (1) values. See http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2netwk.mspx#XSLTsection128121120120 for more info on RestrictRemoteClients.

Schließlich, während Sie Ihre Frage nicht spezifisch eine sehr wichtige Sache über die Verwendung der TransactionScope Klasse zu beachten ist, dass die Standardeinstellung eine Transaction Isolation Level of Serializable zu verwenden ist. Serializable ist das restriktivste der Isolationsstufen und ehrlich gesagt ist es überraschend, dass es als Standard gewählt wurde. Wenn Sie nicht über dieses Niveau brauchen Verriegelungs würde ich empfehlen die Isolationsstufe auf eine weniger restriktive Option Einstellung (ReadCommitted), wenn ein TransactionScope Instanziierung:

var scopeOptions = new TransactionOptions(); 
scopeOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; 
scopeOptions.Timeout = TimeSpan.MaxValue; 

using (var scope = new TransactionScope(TransactionScopeOption.Required, 
    scopeOptions)) 
{ 
    // your code here 
} 
+0

Ich realisiere von deinem Screenshot, dass du kein XP verwendest, aber ich dachte, der XP SP2 Artikel könnte zutreffen. – ahsteele

+0

Ich denke, das hat das erste Problem behoben, das ich bekam. Der zweite Fehler scheint spezifisch für das Entity-Framework zu sein. Ich werde eine andere Frage dafür stellen. – NotDan

+2

Ich habe das endlich behoben. Windows Firewall blockierte die Verbindungen zu MS-DTC. – NotDan

0

Wenn Sie SQL Server 2000 verwenden, System.Transactions.TransactionScope verursachen Alle Transaktionen, die zu Distributed Transactions hochgestuft werden sollen, erfordern die Ausführung von MS Distributed Transaction Coordinator.

Sie können dieses Problem beheben, indem Sie den MSDTC-Dienst starten, ein Upgrade auf SQL Server 2005, oder so etwas wie meine Codeproject Lösung implementieren: http://www.codeproject.com/KB/database/typed_dataset_transaction.aspx

Ich habe es nie tun muß, aber Sie sollten auch Ocdecio Antwort prüfen Konfigurieren Sie auch die Netzwerksicherheitseinstellungen für DTC.

+0

Eine Notiz oben hinzugefügt, ich benutze Sql Server 2005 – NotDan

2

Systemsteuerung - Verwaltung - Komponentendienste - Eigenschaften des Computers - Registerkarte MSDTC - Registerkarte Sicherheitskonfiguration - Netzwerk-DTC-Zugriff (aktiviert)/Remote-Clients zulassen (aktiviert)/Eingehend zulassen (aktiviert)/Ausgehende Verbindung zulassen (aktiviert)/TIP-Transaktionen aktivieren (aktiviert)

Computer neu starten.

+0

Dank ich fehlte der Neustart Computer Teil. – melaos

2

Je nach verwendetem Backend muss Transac- tionScope häufig den Distributed Transaction Manager aktivieren. Einige Details sind on this MSDN blog.

Wenn Sie mehrere Ressourcen verwenden, ist möglicherweise ein DTC erforderlich. Das Aktivieren von DTC kann in Ihrer Situation erforderlich sein, oder Sie müssen sicherstellen, dass Sie SQL Server 2005 verwenden und sich an das halten, was bei Lightweight-Transaktionen möglich ist.

1

Sie müssen DTC für den Netzwerkzugriff in der Sicherheitskonfiguration für MSDTC mithilfe des Verwaltungstools für Komponentendienste aktivieren.

0

Sie benötigen Netzwerk-DTC-Zugriff sowohl für den Datenbankserver zu ermöglichen und der Server, auf dem die Anwendung ausgeführt wird.

Sie müssen auch sicherstellen, dass Verbindungen nicht durch eine Firewall blockiert werden. Da eine Verbindung vom Datenbankserver zur Anwendungsmaschine initiiert wird, ist es ebenso wichtig, MSDTC zur Liste der Firewall-Ausnahmen auf der Anwendungsmaschine hinzuzufügen.

0

Ich hatte das gleiche Problem beim Ausführen von Integrationstests.

gab ich eine Frage zu diesem here

aber schließlich fand ich einen Weg darum herum. Obwohl ich das für den Produktionscode nicht empfehlen würde. Ich habe es im Rahmen von Tests gemacht.