Используя 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 , которая, казалось, указывала, что это была ошибка, связанная с сетью.
Несколько вопросов, по которым я мог бы воспользоваться помощью:
- Какие варианты у меня есть, чтобы устранить эту ошибку?
- Это более чем вероятно, связано с сетью, или БД может быть подозрительной?
- Как я могу узнать из кода,транзакция действительно завершилась?
- Должен ли я запросить у БД эту ошибку, чтобы проверить успешность, или просто повторить транзакцию?
- Если я повторю транзакцию, как это можно выполнить автоматически с помощью Entity?Фреймворк или мне просто перехватить / повторить попытку?
- Какие еще предметы мне стоит посмотреть?
Заранее спасибо.
ОБНОВЛЕНИЕ
Используя Ignite для SQL , мы смогли определить, что вторичный процесс SQL из другой группы монополизировал ЦП, мешая нашему приложению функционировать должным образом.Короче говоря, мы продвигаемся вперед с добавлением вторичного сервера, чтобы предотвратить дальнейшие конфликты между двумя командами.
Что еще интересно в исключении, так это то, что транзакция действительно прошла, а не провалилась.