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()

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

有人知道这个问题吗?

非常感谢,马蒂亚斯

【问题讨论】:

服务器日志什么也没说? (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#:事务回滚超时异常的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server事务回滚对自增键的影响

SQL Server事务遭遇网络异常时的处理机制浅析

SQL Server事务执行一半出错是否自动回滚整个事务

哪些异常是RuntimeException?Sql异常属于RuntimeException吗?Spring下SQL异常事务回滚

SQL Server 2005 - 无法回滚嵌套事务

SQL Server CE 回滚不撤消删除