2010-04-12 4 views
16

Wir haben einen Webdienst auf Server # 1 und eine Datenbank auf Server # 2. Der Web-Service verwendet den Transaktionsbereich, um verteilte Transaktionen zu erzeugen. Alles ist richtig.Ausnahme "Die Operation ist für den Status der Transaktion nicht gültig" mit TransactionScope

Und wir haben eine andere Datenbank auf Server # 3. Wir hatten einige Probleme mit diesem Server und wir haben das Betriebssystem und die Software neu installiert. Wir haben MSDTC konfiguriert und versucht, den Webdienst von Server 1 zu verwenden, um mit der Datenbank auf diesem Server zu kommunizieren. Und jetzt nach dem ersten Select-Anweisung im Transaktionsbereich erhalten wir: The operation is not valid for the state of the transaction. Diese Ausnahme fällt in jede Web-Service-Anforderung, wenn sie den Transaktionsbereich verwendet. Server # 2 und Server # 3 ist fast ähnlich. Der Unterschied kann nur in Einstellungen sein. .NET Framework 3.5 SP1 installiert und SQL Server SP3 auf allen Servern.

Vollstacktrace:

System.Transactions.TransactionState.EnlistPromotableSinglePhase (InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaktion Atomic) в System.Transactions.Transaction.EnlistPromotableSinglePhase (IPromotableSinglePhaseNotification promotableSinglePhaseNotification) в System.Data.SqlClient.SqlInternalConnection.EnlistNonNull (Transaktion t System.Data.SqlClient.SqlInte rnalConnection.Enlist (Transaktion T в System.Data.SqlClient.SqlInternalConnectionTds.Activate (Transaktion Transaktion) в System.Data.ProviderBase.DbConnectionInternal.ActivateConnection (Transaktion Transaktion) в System.Data.ProviderBase.DbConnectionPool.GetConnection (DbConnection owningObject) в System.Data.ProviderBase.DbConnectionFactory.GetConnection (DbConnection owningConnection) в System.Data.ProviderBase.DbConnectionClosed.OpenConnection (DbConnection outerConnection, DbConnectionFactory connection) в System.Data.SqlClient.SqlConnection.Open() NHibernate.Connection.DriverConnectionProvid er.GetConnection() в NHibernate.Impl.SessionFactoryImpl.OpenConnection()

ich diese Meldung gesucht, aber es noch keine geeignete Lösung gefunden. Welche Einstellungen sollte ich überprüfen und was genau sollte ich tun, um es zu beheben?

+0

Welche OS und wie genau Sie MSDTC konfiguriert haben? –

+0

Welche Form des TransactionScope() - Konstruktors verwenden Sie? – gprasant

+0

Hallo Lanfear, Haben Sie dieses Problem gelöst? Wir erhalten denselben Fehler in der Testumgebung. Derselbe Code in der Dev-Umgebung funktioniert einwandfrei. –

Antwort

30

Lanfear, ich habe die gleiche Fehlermeldung gefunden und ich habe eine Lösung gefunden. Ihre Situation könnte anders sein, aber ich hoffe, dass das folgende Wissen für Sie nützlich sein wird.

System.Transactions.Transaction.Current.TransactionInformation.Status wird den Status der aktuellen Transaktion zurückgeben.

In jedem Fall, in dem eine Ausnahme mit der Nachricht The operation is not valid for the state of the transaction ausgelöst wird, wenn ich mit dem Debugger gehe, sehe ich, dass der Status "Aborted" ist, bevor die Ausnahme ausgelöst wird.

In meinem Fall wurde das Problem verursacht, indem zwei Transaktionen ineinander verschachtelt und beide fälschlicherweise abgebrochen wurden, wenn ich nur einen abbrechen wollte. Wenn Sie den TransactionScope Standardkonstruktor New TransactionScope() mit zwei geschachtelten Transaktionen verwenden, wird die äußere Transaktion durch Abbrechen der inneren Transaktion anscheinend ebenfalls abgebrochen.Die Lösung besteht darin, den Konstruktor New TransactionScope(TransactionScopeOption.RequiresNew) zu verwenden. Mit diesem Konstruktor wird die innere Transaktion eine neue Transaktion sein und das Abbrechen der äußeren Transaktion wird nicht abgebrochen.

Das löste mein Problem.

+3

Mit System.Transactions.Transaction.Current.TransactionInformation.Status konnte ich genau feststellen, wann die Transaktion abgebrochen wurde. –

5

Die Aktivierung des Distributed Transaction Coordinators hat das Problem für mich gelöst (dies wurde auf beiden Rechnern durchgeführt: dem, der den Webservice hat und dem, der die Datenbank hat. Nicht sicher, wenn er für den Webservice benötigt wird).

Ich folgte die hier beschriebenen Schritten, um die DTC zu ermöglichen und eine Ausnahme von dem Windows-Firewall hinzuzufügen: Enable Network DTC Access for Windows Server 2008

Verwandte Themen