20

Entity Framework を使用して、昨夜、アプリケーションの 1 つで次の例外を多数受け取りました。

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. ネットワークに関連している可能性が高いですか、それとも DB が疑わしいのでしょうか?
  3. トランザクションが本当に完了したかどうかをコードからどのように判断できますか?
  4. このエラーで DB にクエリを実行して、成功したかどうかを確認するか、単にトランザクションを再試行する必要がありますか?
  5. トランザクションを再試行する場合、これを Entity Framework で自動的に行うにはどうすればよいですか? または単にキャッチ/再試行するだけですか?
  6. 他に見るべきアイテムは?

前もって感謝します。

アップデート

Ignite for SQLを使用して、別のグループのセカンダリ SQL プロセスが CPU を独占していて、アプリケーションが正常に機能していないことを確認できました。つまり、2 つのチーム間のさらなる競合を防ぐために、セカンダリ サーバーの追加を進めています。

この例外で興味深いのは、トランザクションが失敗したのではなく、実際に成功したことです。

4

2 に答える 2

1

私の賭けは、トランザクション コミット コマンドからの成功応答が送信されなかった (または十分に速く送信されなかった) ため、コードで例外が発生したことです。ちょっとクレイジーなエッジケース。この種の例外は、Aエラーが発生したというだけで、コマンドの実際の実行が失敗したことを必ずしも意味するわけではありません。

同様に、Web サービス呼び出しからの応答の送信に問題があったとしても、必ずしもその呼び出しの副作用が適用されなかったことを意味するわけではありません。

于 2012-05-24T08:52:06.147 に答える