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

时间:2010-10-20 11:23:33

标签: c# sql-server transactions timeout 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,但显然在这种情况下这些不是问题。

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

非常感谢,Matthias

2 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:3)

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