System.Data.EntityException: базовый поставщик не удалось при фиксации - PullRequest
19 голосов
/ 08 декабря 2011

Используя 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?Фреймворк или мне просто перехватить / повторить попытку?
  6. Какие еще предметы мне стоит посмотреть?

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

ОБНОВЛЕНИЕ

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

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

Ответы [ 2 ]

1 голос
/ 24 мая 2012

Моя ставка в том, что ответ об успешном выполнении команды фиксации транзакции не был отправлен (или отправлен недостаточно быстро), что вызвало исключение в вашем коде. Своего рода безумный крайний случай. Исключения такого рода не обязательно означают, что фактическое выполнение команды завершилось неудачей только из-за ошибки A .

Точно так же, если при отправке ответа от вызова веб-службы возникла проблема, это не обязательно означает, что какие-либо побочные эффекты этого вызова не применялись.

0 голосов
/ 11 мая 2013

+ 1 для Люка, объяснение хорошее. Неправильная формулировка ошибки.

System.Data.EntityException: **The underlying provider failed on Commit.** ---> 
System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior 

следует прочитать

System.Data.EntityException: **The underlying provider failed to respond to Commit**
System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior 

вероятными причинами являются проблемы сети или сервера.например, 100 CPU или другая задержка сервера, все еще корректны.НО вы НЕ ЗНАЕТЕ, совершил он или нет, если это тайм-аут.Если ответ получен с ошибкой, БД должна была откатиться.Конечно, если этого не произошло, то произошел сбой БД, что привело к потенциальному повреждению.Редко, я надеюсь.

Я видел в таблице более 1 миллиарда строк ... Во время выделения пространства в процессе роста, когда индекс и область данных нуждаются в расширении, занимают более 30 секунд.НО КОМИТЕТ БЫЛ.Время ожидания клиента истекло.Онлайн-реорганизации также могут вызывать такие задержки (ну, я видел это по крайней мере в DB2)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...