SQL Server, C #: исключение тайм-аута при откате транзакции

У меня странная проблема. У меня есть программа .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, но, очевидно, это не проблема в данном случае.

Есть у кого-нибудь представление об этой проблеме?

Большое спасибо, Матиас


person Matthias    schedule 20.10.2010    source источник
comment
Логи сервера ни о чем не говорят? (MS SQL) Думаете, что откат может быть довольно тяжелым ..?   -  person Onkelborg    schedule 20.10.2010
comment
вы упомянули .net программу, это winforms или webforms?   -  person Rippo    schedule 20.10.2010
comment
Вы имеете в виду sys.xp_readerrorlog? Не показывает ошибок ...   -  person Matthias    schedule 20.10.2010


Ответы (2)


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

person Hans Passant    schedule 20.10.2010
comment
это странно, вместо этого следует использовать CommandTimeout. Теперь мне нужно увеличить время подключения, чтобы обрабатывать длинные откаты, что непреднамеренно означает, что если мой sql-ящик выйдет из строя, код будет сидеть и ждать ответа дольше 30 секунд по умолчанию. Хромой. - person Chris Smith; 05.12.2013

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

person Marc Gravell    schedule 20.10.2010