SQL Server,C#:事务回滚超时异常
Posted
技术标签:
【中文标题】SQL Server,C#:事务回滚超时异常【英文标题】:SQL Server, C#: Timeout exception on Transaction Rollback 【发布时间】:2011-04-27 23:50:25 【问题描述】:我遇到了一个奇怪的问题。我有一个 .NET 程序,我的流程逻辑需要在 SQL Server 2005 数据库上执行长时间运行的事务(约 20 分钟)。没关系,因为没有人并行访问数据库。当出现问题时,事务应该回滚。
很少且没有任何可见模式我的DbTransaction
对象上的Rollback()
操作会抛出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()
我不知道这是否真的是一个超时问题,因为代码有时有效,有时无效。此外,我知道的唯一超时是 ConnectionTimeout
和 CommandTimeout
,但显然在这种情况下这些不是问题。
有人知道这个问题吗?
非常感谢,马蒂亚斯
【问题讨论】:
服务器日志什么也没说? (MS SQL)认为回滚可能会很重..? 你提到.net程序是winforms还是webforms? 您是指“sys.xp_readerrorlog”吗?不显示任何错误... 【参考方案1】:事务可能需要一段时间才能回滚;如果这需要太长时间,请确保您会超时。似乎没有明显的方法来影响这一点 - 你可以尝试通过 TSQL 管理事务 - 然后你可以(ab)使用 CommandTimeout
- 但它可能只是需要如果您要在交易中进行 很多 的更改,则需要一点时间; SQL Server 假设大多数事情都会运行完成,因此“提交”实际上是免费的,而“回滚”则更昂贵。
【讨论】:
【参考方案2】:Sql Server 团队的 Matt Neerincx 在MSDN forum question 中解决了这个问题。奇怪但真实,连接字符串中的连接超时用于设置超时。由他查看源代码验证。
【讨论】:
这很奇怪,它应该使用 CommandTimeout 代替。现在我必须增加连接时间来处理长回滚,这无意中意味着如果我的 sql 框出现故障,代码将等待比默认的 30 秒更长的时间来响应。跛脚。以上是关于SQL Server,C#:事务回滚超时异常的主要内容,如果未能解决你的问题,请参考以下文章
哪些异常是RuntimeException?Sql异常属于RuntimeException吗?Spring下SQL异常事务回滚