C# 例外情况;该操作对于事务的状态无效";使用TransactionScope

C# 例外情况;该操作对于事务的状态无效";使用TransactionScope,c#,sql-server,nhibernate,msdtc,C#,Sql Server,Nhibernate,Msdtc,我们在服务器1上有一个web服务,在服务器2上有一个数据库。 Web服务使用事务作用域生成分布式事务。一切都是正确的 我们在服务器3上还有另一个数据库。这台服务器出现了一些问题,我们重新安装了操作系统和软件。我们配置了MSDTC,并尝试使用服务器#1上的web服务与该服务器上的数据库通信。 现在,在事务范围内的第一个select语句之后,我们得到:该操作对于事务的状态无效。如果每个web服务请求使用事务作用域,则会出现此异常。 服务器2和服务器3几乎相似。差异仅在设置中存在。 已在所有服务器上安

我们在服务器1上有一个web服务,在服务器2上有一个数据库。 Web服务使用事务作用域生成分布式事务。一切都是正确的

我们在服务器3上还有另一个数据库。这台服务器出现了一些问题,我们重新安装了操作系统和软件。我们配置了MSDTC,并尝试使用服务器#1上的web服务与该服务器上的数据库通信。 现在,在事务范围内的第一个select语句之后,我们得到:
该操作对于事务的状态无效。如果每个web服务请求使用事务作用域,则会出现此异常。
服务器2和服务器3几乎相似。差异仅在设置中存在。
已在所有服务器上安装.NET framework 3.5 SP1和SQL Server SP3

完整堆栈跟踪:


System.Transactions.TransactionState.EnglistPromotableSinglePhase(InternalTransaction tx,IpromotatableSinglephase通电 promotableSinglePhaseNotification,事务原子化事务处理)
System.Transactions.Transaction.EnglistPromotableSinglePhase(IPromotableSinglePhase)加密 促进单相转化)法 System.Data.SqlClient.SqlInternalConnection.EnstractNonNull(事务 töSystem.Data.SqlClient.SqlInternalConnection.Enlist(事务tö System.Data.SqlClient.sqlinternalconnectionds.Activate(事务 (a)交易) System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(事务 (a)交易) System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection 拥有对象)of System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection 拥有连接)of System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection 外部连接,数据库连接工厂连接工厂) System.Data.SqlClient.SqlConnection.Open()函数 NHibernate.Connection.DriverConnectionProvider.GetConnection()函数 NHibernate.Impl.SessionFactoryImpl.OpenConnection()

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

Lanfear,我遇到了相同的错误消息,并找到了解决方案。您的情况可能有所不同,但我希望以下知识对您有用


System.Transactions.Transaction.Current.TransactionInformation.Status
将返回当前事务的状态

在每种情况下,当抛出异常时都会显示消息
,操作对于事务的状态无效
,当我使用调试器单步执行时,我会看到在抛出异常之前状态为“中止”

在我的例子中,问题是由于将两个事务嵌套在彼此内部,并在我只想中止一个事务时错误地中止了这两个事务。显然,如果使用
TransactionScope
default构造函数
New TransactionScope()
对于两个嵌套事务,中止内部事务也会中止外部事务。解决方案是使用构造函数
New TransactionScope(TransactionScopeOption.RequiresNew)
使用此构造函数,内部事务将是一个新事务,中止它不会中止外部事务


这解决了我的问题。

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


我按照此处描述的步骤启用DTC并向Windows防火墙添加一个异常:

什么操作系统以及您是如何配置MSDTC的?TransactionScope()的什么形式您正在使用的构造函数?嗨,Lanfear,您解决了这个问题吗?我们在测试环境中遇到了相同的错误。Dev环境中的相同代码工作正常。System.Transactions.Transaction.Current.TransactionInformation.Status帮助我精确地指出了事务中止的确切时间。@AdamMarshall使用
Transaction的真实世界示例信息。状态