System.Data.EntityException: сбой базового поставщика при фиксации

Используя Entity Framework, вчера вечером я получил ряд следующих исключений в одном из моих приложений:

System.Data.EntityException: The underlying provider failed on Commit. ---> 
System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior 
to completion of the operation or the server is not responding.     
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()     
    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.ReadNetworkPacket()     
    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.Commit()     
    at System.Data.SqlClient.SqlTransaction.Commit()
    at System.Data.EntityClient.EntityTransaction.Commit()     
    --- End of inner exception stack trace ---     
    at System.Data.EntityClient.EntityTransaction.Commit()     
    at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)     
    at System.Data.Entity.Internal.InternalContext.SaveChanges()     
    at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()

Что интересно в этой ошибке, так это то, что данные были фактически записаны в базу данных. Я нашел соответствующее сообщение на сайте MS , которое, казалось, указывало на то, что это была ошибка, связанная с сетью.

Вот несколько вопросов, по которым я мог бы воспользоваться помощью:

  1. Какие у меня есть варианты, чтобы устранить эту ошибку?
  2. Это более чем вероятно связано с сетью или может быть подозреваемой БД?
  3. Как могу ли я узнать по коду, действительно ли транзакция завершилась?
  4. Следует ли мне запрашивать БД об этой ошибке, чтобы проверить, успешна ли транзакция, или просто повторить транзакцию?
  5. Если я все же попытаюсь повторить транзакцию, как это можно выполнить автоматически с Entity Framework или просто поймать / повторить попытку?
  6. Какие еще элементы мне следует рассмотреть?

Заранее спасибо.

ОБНОВЛЕНИЕ

Используя Ignite for SQL , мы смогли определить, что вторичный процесс SQL из другой группы монополизировал ЦП, препятствуя правильной работе нашего приложения. Короче говоря, мы продвигаемся вперед и добавляем дополнительный сервер, чтобы предотвратить дальнейшие конфликты между двумя командами.

Что еще интересно в этом исключении, так это то, что транзакция фактически завершилась успешно, а не провалилась.

19
задан Randy 9 December 2011 в 12:57
поделиться