2016-09-08 8 views
2

私はロードを継承したMVC Webアプリケーションを持っています。MyCategoryとそのすべての子をWebフォームと呼び、編集を行い、次にクリック保存します。アプリケーションが動作する方法は、まず、モデル内の親レベルエンティティのすべてのデータを削除し、すべてを元に戻すことです。私たちは、これにはかなりの同時ユーザーベースしかありません。最大で毎晩二十分の節約で20人以下です。私たちは、ローカルでこのエラーを再現することはできませんが、オフショアチームの開始が動作したときに、我々はEntity Framework単純なDeleteAllで「待機操作がタイムアウトしました」

[SqlExceptionが(0x80131904)を見て始めている:タイムアウトが発生しました。操作が完了する前にタイムアウト時間 が経過しているか、サーバーが応答していません( )。声明は終了しました。]

エラーが表示されます。これは、親テーブルのLINQからの削除を呼び出すときに起こります(この時点ではデータはなく、子テーブルもありません)。これは断続的ですが、この1週間で何度か起こってしまいました。そこでは、プロジェクトのこの部分で作業が進んでいました。

スタックトレースから、109分以上経過しているように見えるSystem.Data.SqlClient.SqlCommand.FinishExecuteReaderで失敗しているように見えます。これは、テーブルから最大でtqoレコードを削除する必要があります。このテーブルからデータをロードする人は、非常に短時間で最大2つのレコードを取得する必要があります。

どこから始めればいいと思いますか?残念ながら、本番データベースでSQL Query AnalyzerまたはActivity Monitorを実行する権限がありません。

コールスタックは、次のとおりです。

[SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
The statement has been terminated.] 
    System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +388 
    System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +717 
    System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +4515 
    System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +6557561 
    System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) +6560327 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +586 
    System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) +742 
    System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +287 
    System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) +789 
    System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) +188 
    System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +500 
    System.Data.Linq.StandardChangeDirector.DynamicDelete(TrackedObject item) +71 
    System.Data.Linq.StandardChangeDirector.Delete(TrackedObject item) +258 
    System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) +622 
    System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +932 
    WebAppData.MyCategory.MyCategoryData.DeleteAll(Int32 id, Guid gid) +1053 
    WebAppServices.MyCategory.MyCategoryService.DeleteMyCategoryParentItems(Int32 id, Guid gId) +1632 
    WebAppServices.MyCategory.MyCategoryService.UpdateMyCategory(Int32 id, Guid gId, MyCategoryEntity mce) +51 
    WebAppUI.Areas.Documents.Categories.Sections.MyCategory.MyCategoryController.Save(Int32 Id, Guid gId, MyCategoryModel model) +93 

EDIT:

接続文字列:

<add name="Data" connectionString="Data Source=myserver;Initial Catalog=mydatabase;User ID=myuser;Password=mypassword /> 
+0

です。サーバーが利用可能で応答性が高いですか? – DevilSuichiro

+0

接続文字列を表示できますか? – Sampath

+0

デッドロックの可能性があります。また、レコードの範囲を指す単一の削除ステートメントではなく、EFからの削除が行ごとに実行されるため、削除のボリュームになることもあります。あなたが何が起こっているかを見ることができるようにその許可を持っている人を見つけることをお勧めします。 – Igor

答えて

1

これはあなたの問題のための1つの一時的な解決策である以下に示すように、右now.YouがTimeoutを増やすことができますしかし、この問題の原因となるのはEF queryで、パフォーマンスを改善する必要があります。

注:ここで時間実際に、これはサーバーの問題のように聞こえるん

public DbContext() : base("Default") 
     { 
      this.Database.CommandTimeout = 60; 
     } 
+0

これについてのご意見はありますか? – Sampath

関連する問題