19

我们在服务器 #1 上有一个 Web 服务,在服务器 #2 上有一个数据库。Web 服务使用事务范围来产生分布式事务。一切都是正确的。

我们在服务器#3 上有另一个数据库。我们在这台服务器上遇到了一些问题,我们重新安装了操作系统和软件。我们配置了 MSDTC 并尝试使用服务器 #1 的 Web 服务与该服务器上的数据库进行通信。现在,在事务范围内的第一个 select 语句之后,我们得到: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, Transaction atomicTransaction) - System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification) - System.Data.SqlClient.SqlInternalConnection.EnlistNonSqlClient. .Enlist(Transaction t × System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction) × System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction) × System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) × System. Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) × 系统。Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) - System.Data.SqlClient.SqlConnection.Open() - NHibernate.Connection.DriverConnectionProvider.GetConnection() - NHibernate.Impl.SessionFactoryImpl.OpenConnection()

我搜索了此消息,但没有找到任何合适的解决方案。那么我应该检查哪些设置以及我应该做些什么来修复它?

4

2 回答 2

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) 使用这个构造函数,内部事务将是一个新事务并且中止它不会中止外部事务。

这解决了我的问题。

于 2010-06-28T21:10:02.367 回答
5

启用分布式事务协调器为我解决了这个问题(这是在两台机器上完成的:一台具有 Web 服务,另一台具有数据库。不确定 Web 服务是否需要它)。

我按照此处描述的步骤启用了 DTC 并向 Windows 防火墙添加了例外:为 Windows Server 2008 启用网络 DTC 访问

于 2011-04-08T11:14:49.133 回答