Ответ 1
Matt Neerincx из команды Sql Server обратился к этому вопросу в
У меня странная проблема. У меня есть программа .NET, и моей логике процесса требуется долговременная транзакция (~ 20min) в базе данных 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
, но, очевидно, это не проблема в этом случае.
Есть ли у кого-нибудь идеи об этой проблеме?
Большое спасибо, Matthias
Matt Neerincx из команды Sql Server обратился к этому вопросу в
Транзакции могут занять некоторое время для отката; если это займет слишком много времени, убедитесь, что вы получите тайм-аут. Кажется, что нет очевидного способа повлиять на это - вы можете попробовать управлять транзакцией через TSQL, - тогда вы можете (ab) использовать CommandTimeout
, но может быть просто, что это займет немного времени, если вы делаете много изменений внутри транзакции; SQL Server предполагает, что большинство вещей будет завершено, поэтому "фиксация" практически бесплатна, а "откат" дороже.