Сбой обновления Entity Framework для большой таблицы - Исключение: Тайм-аут операции ожидания - PullRequest
0 голосов
/ 08 января 2020

Сбой обновления Entity Framework 6.1.3 для большой таблицы в производственной среде

Исключение:

Время ожидания операции истекло

У меня есть таблица Issue с почти 8000000 записями. При вставке записей возникает исключение

Время ожидания операции ожидания истекло

При вставке записи мы выполняем некоторые фоновые задачи в транзакции SQL.

  1. Вставить значения в таблицу Notification (для отправки уведомления пользователю).
  2. Вставить значения в таблицу Change. В таблице Change хранится измененное значение истории, старое значение, новое значение и т. Д. c. И я думаю, что эта транзакция вызывает исключение тайм-аута. Требуются входные данные
-- statement #1
begin transaction with isolation level: ReadCommitted

-- statement #2
UPDATE [dbo].[Issues]
SET [CategoryID] = @0, [SubcategoryID] = @1, [HandlerID] = @2, [Modified] = @3, [RegionID] = @4, [TeamID] = @5, [Closed] = @6, [Address] = @7, [AddressDetails] = @8, [Description] = @9, [Location] = @10, [Status] = @11, [Visibility] = @12, [ReportedBy_Address] = @13, [ReportedBy_EmailAddress] = @14, [ReportedBy_Name] = @15, [ReportedBy_PhoneNumber] = @16, [ForwardedMessage] = @17, [IsUrgent] = @18, [IsNewlyAssigned] = @19, [CategoryField] = @20, [IntegrationFault] = @21
WHERE ([ID] = @22)

-- statement #3
INSERT [dbo].[ChangeSets]([Created], [ApplicationID], [UserID])
VALUES (@0, @1, NULL)
SELECT [ID]
FROM [dbo].[ChangeSets]
WHERE @@ROWCOUNT > 0 AND [ID] = scope_identity()

-- statement #4
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #5
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #6
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #7
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #8
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #9
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #10
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #11
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #12
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #13
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #14
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #15
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #16
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #17
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #18
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #19
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #20
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #21
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Changes]([ChangeSetID], [EntityID], [Name], [Type], [PreviousValue], [NewValue])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, @3, @4, @5)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Changes] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #22
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Notifications]([Created], [CreatedByID], [Modified], [ModifiedByID], [UserID], [Person_Address], [Person_EmailAddress], [Person_Name], [Person_PhoneNumber], [Type], [IssueID], [CommentID], [AttachmentID], [RegionID], [OrganizationID], [IsHidden], [IsRead])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, NULL, NULL, NULL, @1, NULL, NULL, NULL, NULL, @2, @3, NULL, NULL, @4, @5, @6, @7)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Notifications] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #23
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Notifications]([Created], [CreatedByID], [Modified], [ModifiedByID], [UserID], [Person_Address], [Person_EmailAddress], [Person_Name], [Person_PhoneNumber], [Type], [IssueID], [CommentID], [AttachmentID], [RegionID], [OrganizationID], [IsHidden], [IsRead])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, NULL, NULL, NULL, NULL, NULL, @1, @2, NULL, @3, @4, NULL, NULL, @5, @6, @7, @8)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Notifications] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #24
DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Notifications]([Created], [CreatedByID], [Modified], [ModifiedByID], [UserID], [Person_Address], [Person_EmailAddress], [Person_Name], [Person_PhoneNumber], [Type], [IssueID], [CommentID], [AttachmentID], [RegionID], [OrganizationID], [IsHidden], [IsRead])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, NULL, NULL, NULL, NULL, @1, @2, @3, @4, @5, @6, NULL, NULL, @7, @8, @9, @10)
SELECT t.[ID]
FROM @generated_keys AS g JOIN [dbo].[Notifications] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0

-- statement #25
commit transaction

Исключение

Ошибка: System.Data.Entity.Infrastructure.DbUpdateException: при обновлении записей произошла ошибка. Смотрите внутреннее исключение для деталей. ---> System.Data.Entity.Core.UpdateException: при обновлении записей произошла ошибка. Смотрите внутреннее исключение для деталей. ---> System.Data.SqlClient.SqlException: истекло время ожидания выполнения. Время ожидания истекло до завершения операции или сервер не отвечает. ---> System.ComponentModel.Win32Exception: Тайм-аут операции ожидания --- Конец внутренней трассировки стека исключений --- в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection, действие 1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.SqlCommand.InternalEndExecuteNonQuery(IAsyncResult asyncResult, String endMethod, Boolean isInternal) at System.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal(IAsyncResult asyncResult) at System.Data.SqlClient.SqlCommand.EndExecuteNonQueryAsync(IAsyncResult asyncResult) at System.Threading.Tasks.TaskFactory 1. FromAsyncCoreLogi c (IAsyncResult iar, Fun c2 endFunction, Action 1 endAction, Task 1 promise, Boolean requiresSynchronization) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.d__0.MoveNext() --- End of inner exception stack trace --- at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Data.Entity.Core.Objects.ObjectContext.d__3d 1.MoveNext () --- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime.ExceptionServices .ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.Data.Entity.Core.Objects.ObjectContext.d__39.MoveNext () --- место окончания предыдущего стека из было брошено --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.Data.Entity.SqlServer.DefaultSql.15. MoveNext () в E: _work4 \ 10 \ s \ Fixi2 \ Main \ Decos.Fixi.Api \ De cos.Fixi.Data \ Services \ ServiceBase.cs: строка 181 --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices. TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача задачи) в Decos.Fixi.Data.Services.IssueService.d__19.MoveNext () в E: _work4 \ 10 \ s \ Fixi2 \ Main \ Decos.Fixi.Api \ Decos.Fixi.Data \ Services IssueService.cs: строка 277 --- Конец трассировки стека из предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) в Decos.Fixi.WebApi.Controllers.IssuesController.d__20.MoveNext () в E: _work4 \ 10 \ s \ Fixi2 \ Main \ Decos.Fixi.Api \ Decos.Fixi.WebApi \ Controllers \ IssuesController.cs: строка 593 - - Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в Syste m.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.Threading.Tasks.TaskHelpersExtensions.d__3`1.MoveNext () --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в System.Runtime .ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TaskAwaiter. было брошено --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.Web.Http.Filters. ActionFilterAttribute.d__5.MoveNext () --- Конец трассировки стека из предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext () --- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) в System.Web. Http.Filters.ActionFilterAttribute.d__0.MoveNext () --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TccesskAwaiter.HandleNugSu (Задача) в System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext () --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () at System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext () --- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime. CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.Web.Http.Filters.ActionFilterAttribute.d__0.MoveNext () --- Конец трассировки стека из предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.ExceptionSpvices. .Throw () в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext () --- Конец трассировки стека из предыдущего расположения, где было выброшено исключение - - в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext () --- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime .ExceptionServices.E xceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.Web.Http.Filters.ActionFilterAttribute.d__0.MoveNext () - конец места, где ранее находилась искомая трасса стека - в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.Web.Http.Controllers.ActionFilterResult.ext (). трассировка от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в System.Web.Http.Filters.Attribute MoveNext () --- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TaskAwaite r.HandleNonSuccessAndDebuggerNotification (Задача) в Decos.Fixi.WebApi.Annotations.AuthenticateApplicationAttribute.d__8.MoveNext () в E: _work4 \ 10 \ s \ Fixi2 \ Main \ Decos.Fixi.Api \ DecosAixi ApplicationAuthenticationAttribute.cs: строка 108 --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Web.Http.Controllers.AuthenticationFilterResult.d__0.MoveNext ( ) --- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) в System.Web.Http .Controllers.ExceptionFilterResult.d__0.MoveNext ()

1 Ответ

0 голосов
/ 08 января 2020

Не уверен, какую версию EF вы используете, но независимо от того, вам нужно установить время ожидания команды. По умолчанию он равен 30 секундам, поэтому он не будет работать для вас.

В EF 6 он был установлен следующим образом: this.context.Database.CommandTimeout = 0; EF 5, что-то вроде этого: ((IObjectContextAdapter) this.context) .ObjectContext.CommandTimeout = 0; В ядре EF: this.context.Database.SetCommandTimeout (0);

Значение указывается в секундах. Если вы установите значение 0, оно «неограниченно». Я бы сказал, это то, что тебе нужно.

...