代码之家  ›  专栏  ›  技术社区  ›  Matthias

SQL Server,C 35;:事务回滚时出现超时异常

  •  16
  • Matthias  · 技术社区  · 14 年前

    我有个奇怪的问题。我有一个.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()

    我不知道这是否真的是一个超时问题,因为代码有时工作,有时不工作。而且我知道的唯一的超时是 ConnectionTimeout CommandTimeout ,但显然这不是本例中的问题。

    谢谢你,马蒂亚斯

    2 回复  |  直到 14 年前
        1
  •  24
  •   Hans Passant    14 年前

    Sql Server团队的Matt Neerincx在 MSDN forum question . 奇怪的是,连接字符串中的连接超时用于设置超时。通过查看源代码验证。

        2
  •  3
  •   Marc Gravell    14 年前

    尝试 通过TSQL管理事务-然后您可以(ab)使用 CommandTimeout 太多了 事务内部的更改;SQL Server 大多数事情都会运行到完成,所以“提交”实际上是免费的,而“回滚”则更昂贵。