18

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

Rollback()对我的对象的操作很少且没有任何可见的模式DbTransaction会抛出SqlException

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

堆栈跟踪:
   在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔 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 字节预期)
   在 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)
   在 System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(字节 [] 缓冲区,TransactionManagerRequestType 请求,字符串 transactionName,TransactionManagerIsolationLevel isoLevel,Int32 超时,SqlInternalTransaction 事务,TdsParserStateObject stateObj,布尔 isDelegateControlRequest)
   在 System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest,字符串 transactionName,IsolationLevel iso,SqlInternalTransaction internalTransaction,布尔 isDelegateControlRequest)
   在 System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest,字符串名称,IsolationLevel iso,SqlInternalTransaction internalTransaction,布尔 isDelegateControlRequest)
   在 System.Data.SqlClient.SqlInternalTransaction.Rollback()
   在 System.Data.SqlClient.SqlTransaction.Rollback()

我不知道这是否真的是一个超时问题,因为代码有时有效,有时无效。此外,我知道的唯一超时是ConnectionTimeoutand CommandTimeout,但显然在这种情况下这些不是问题。

有人知道这个问题吗?

非常感谢,马蒂亚斯

4

2 回答 2

25

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

于 2010-10-20T11:56:33.203 回答
3

交易可能需要一段时间才能回滚;如果这需要太长时间,请确保您会超时。似乎没有明显的方法来影响这一点 - 您可以尝试通过 TSQL 管理事务 - 然后您可以(ab)使用CommandTimeout- 但如果您进行大量更改,可能需要一点时间交易内部;SQL Server假定大多数事情都会运行完成,因此“提交”实际上是免费的,而“回滚”则更昂贵。

于 2010-10-20T11:43:09.713 回答