Сбой обновления Entity Framework 6.1.3 для большой таблицы в производственной среде
Исключение:
Время ожидания операции истекло
У меня есть таблица Issue
с почти 8000000 записями. При вставке записей возникает исключение
Время ожидания операции ожидания истекло
При вставке записи мы выполняем некоторые фоновые задачи в транзакции SQL.
- Вставить значения в таблицу
Notification
(для отправки уведомления пользователю). - Вставить значения в таблицу
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 ()