SQL Server, C #: исключение тайм-аута при откате транзакции - PullRequest
16 голосов
/ 20 октября 2010

У меня странная проблема.У меня есть программа .NET, и моей логике процесса нужна длительная транзакция (~ 20 минут) в базе данных SQL Server 2005.Это нормально, поскольку никто не обращается к базе данных параллельно.Если что-то идет не так, транзакцию следует откатить.

Нечасто и без видимого шаблона операция 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 ]

24 голосов
/ 20 октября 2010

Мэтт Неринкс из команды Sql Server ответил на этот вопрос в форуме MSDN Странно, но верно, время ожидания подключения из строки подключения используется для установки времени ожидания.Проверено им, глядя на исходный код.

3 голосов
/ 20 октября 2010

Транзакции могут занять некоторое время для отката;если это займет слишком много времени, обязательно получите тайм-аут.Кажется, не существует очевидного способа повлиять на это - вы могли бы попробовать управлять транзакцией через TSQL - тогда вы можете (ab) использовать CommandTimeout - но это может быть просто чтонемного, если вы делаете лоты изменений внутри транзакции;SQL Server предполагает , что большинство вещей будет выполняться до конца, поэтому «commit» практически бесплатен, а «rollback» более дорогой.

...