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

Mat*_*ias 16 c# sql-server timeout transactions sqlexception

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

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

Message: "Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding."

StackTrace:
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
   at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadPacket(Int32 bytesExpected)
   at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
   at System.Data.SqlClient.TdsParserStateObject.ReadByte()
   at 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)
   at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
   at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
   at System.Data.SqlClient.SqlInternalTransaction.Rollback()
   at System.Data.SqlClient.SqlTransaction.Rollback()

我不知道它是否真的是一个超时问题,因为这个代码有时会运行,有时也不会运行.此外,我唯一知道的超时是ConnectionTimeoutCommandTimeout,但显然这些都不是在这种情况下的问题.

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

非常感谢,马蒂亚斯

Han*_*ant 24

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

  • 这很奇怪,它应该使用 CommandTimeout 代替。现在我必须增加我的连接时间来处理长时间的回滚,这无意中意味着如果我的 sql 框出现故障,代码将等待比默认的 30 秒更长的响应时间。瘸。 (2认同)