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()
我不知道这是否真的是一个超时问题,因为代码有时会工作,有时候不会。 此外,我知道的唯一超时是ConnectionTimeout
和CommandTimeout
,但显然在这种情况下这些不是问题。
有没有人对这个问题有所了解?
非常感谢,马蒂亚斯
Sql Server团队的Matt Neerincx在一个MSDN论坛问题中解决了这个问题 。 奇怪但真实,连接字符串的连接超时用于设置超时。 他通过查看源代码validation。
交易可能需要一段时间才能回滚; 如果这需要太长时间,请确保你会超时。 似乎没有一种明显的方法可以影响这一点 – 您可以尝试通过TSQL管理事务 – 然后您可以(ab)使用CommandTimeout
– 但它可能只是需要一点时间,如果你正在做很多交易内部的变化; SQL Server 假设大多数事情都将运行完成,因此“提交”几乎是免费的,而“回滚”则更昂贵。