SQL Server,C#:事务回滚的超时exception

我有一个奇怪的问题。 我有一个.NET程序,我的进程逻辑需要在SQL Server 2005数据库上运行一个长时间的事务(~20分钟)。 没关系,因为没有人并行访问数据库。 当出现问题时,应该回滚事务。

不常见且没有任何可见模式DbTransaction对象上的Rollback()操作会抛出DbTransaction

 消息:“超时已到期。在操作完成之前已经过了超时时间,或者服务器没有响应。”

堆栈跟踪:
   在System.Data.SqlClient.SqlInternalConnection.OnError(SqlExceptionexception,布尔breakConnection)
   在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   在System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj,UInt32错误)
   在System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult,TdsParserStateObject stateObj)
   在System.Data.SqlClient.TdsParserStateObject.ReadPacket(Int32 bytesExpected)
   在System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
   在System.Data.SqlClient.TdsParserStateObject.ReadByte()
   在System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)
    at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte [] buffer,TransactionManagerRequestType request,String transactionName,TransactionManagerIsolationLevel isoLevel,Int32 timeout,SqlInternalTransaction transaction,TdsParserStateObject stateObj,Boolean isDelegateControlRequest)
   在System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest,String transactionName,IsolationLevel iso,SqlInternalTransaction internalTransaction,Boolean isDelegateControlRequest)
   在System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest,String name,IsolationLevel iso,SqlInternalTransaction internalTransaction,Boolean isDelegateControlRequest)
   在System.Data.SqlClient.SqlInternalTransaction.Rollback()
   在System.Data.SqlClient.SqlTransaction.Rollback() 

我不知道这是否真的是一个超时问题,因为代码有时会工作,有时候不会。 此外,我知道的唯一超时是ConnectionTimeoutCommandTimeout ,但显然在这种情况下这些不是问题。

有没有人对这个问题有所了解?

非常感谢,马蒂亚斯

Sql Server团队的Matt Neerincx在一个MSDN论坛问题中解决了这个问题 。 奇怪但真实,连接字符串的连接超时用于设置超时。 他通过查看源代码validation。

交易可能需要一段时间才能回滚; 如果这需要太长时间,请确保你会超时。 似乎没有一种明显的方法可以影响这一点 – 您可以尝试通过TSQL管理事务 – 然后您可以(ab)使用CommandTimeout – 但它可能只是需要一点时间,如果你正在做很多交易内部的变化; SQL Server 假设大多数事情都将运行完成,因此“提交”几乎是免费的,而“回滚”则更昂贵。