2010-04-12 304 views
16

我們在服務器#1上有Web服務,服務器#2上有數據庫。 Web服務使用事務範圍來產生分佈式事務。一切都是正確的。異常「操作對事務狀態無效」使用TransactionScope

而我們在服務器#3上有另一個數據庫。我們在這臺服務器上遇到了一些問題,我們重新安裝了操作系統和軟件。我們配置了MSDTC,並嘗試使用服務器#1的Web服務與此服務器上的數據庫進行通信。 現在,在事務處理範圍內的第一條選擇語句之後,我們得到:The operation is not valid for the state of the transaction。如果使用事務範圍,則此異常會落入每個Web服務請求中。 服務器#2和服務器#3幾乎相似。差異只能在設置中。 在所有服務器上安裝了.NET Framework 3.5 SP1和SQL Server SP3。

完整堆棧跟蹤:

System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction TX,IPromotableSinglePhaseNotification promotableSinglePhaseNotification,交易原子事務)в System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification)в System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction t System.Data.SqlClient.SqlInte rnalConnection.Enlist(事務Tв System.Data.SqlClient.SqlInternalConnectionTds.Activate(事務 交易)в System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(事務 交易)в System.Data.ProviderBase.DbConnectionPool.GetConnection(的DbConnection owningObject)в System.Data.ProviderBase.DbConnectionFactory.GetConnection(的DbConnection owningConnection)в System.Data.ProviderBase.DbConnectionClosed.OpenConnection(的DbConnection outerConnection,DbConnectionFactory connectionFactory的)в System.Data.SqlClient.SqlConnection.Open ()Π NHibernate.Connection.DriverConnectionProvid er.GetConnection()в NHibernate.Impl.SessionFactoryImpl.OpenConnection()

我搜索了這個消息,但並沒有找到任何合適的解決方案。 那麼我應該檢查哪些設置,以及我應該怎麼做才能修復它?

+0

什麼操作系統?你究竟如何配置MSDTC? – 2010-04-12 15:46:24

+0

你使用什麼形式的TransactionScope()構造函數? – gprasant 2010-12-20 07:17:48

+0

嗨Lanfear, 你解決了這個問題嗎?我們在測試環境中遇到同樣的錯誤。開發環境中的相同代碼正常工作。 – 2011-02-18 10:48:09

回答

30

Lanfear,我遇到了同樣的錯誤信息,我發現了一個解決方案。您的情況可能會有所不同,但我希望以下知識對您有所幫助。

System.Transactions.Transaction.Current.TransactionInformation.Status將返回當前事務的狀態。

在每一種情況下拋出異常的消息爲The operation is not valid for the state of the transaction,當我通過調試程序進行檢查時,發現在拋出異常之前狀態爲「中止」。

就我而言,問題是由於將兩個事務嵌套在對方內而造成的,並且在我只想中止一個事務時錯誤地中止了這兩個事務。顯然,如果使用帶有兩個嵌套事務的TransactionScope默認構造函數New TransactionScope(),則中止內部事務也會中止外部事務。解決方法是使用構造函數New TransactionScope(TransactionScopeOption.RequiresNew)使用此構造函數,內部事務將成爲新事務並中止它不會中止外部事務。

這解決了我的問題。

+3

System.Transactions.Transaction.Current.TransactionInformation.Status幫助我精確地確定事務何時被中止。 – 2014-03-31 15:54:52

5

啓用分佈式事務處理協調器爲我解決了這個問題(這是在兩臺機器上完成的:具有Web服務和擁有數據庫的機器,但不確定是否需要Web服務)。

我跟着這裏所描述,使DTC和一個例外添加到Windows防火牆的步驟:Enable Network DTC Access for Windows Server 2008

相關問題