2010-04-12 491 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

相关问题