EF6, выполняющий длительную хранимую процедуру, получает ошибки тайм-аута

azure-sql-database entity-framework entity-framework-6

Вопрос

Недавно я обновил свой проект от EF5 до EF6. В этом проекте у меня есть роль рабочего Azure, которая выполняется периодически и запускает хранимую процедуру на SQL Azure, которая обновляет информацию о базе данных и занимает в среднем 1,5 часа для выполнения. Когда это будет сделано, рабочая роль выполняет дополнительные задачи с результатом возврата хранимой процедуры.

Это использовалось для безупречной работы в EF5, но в EF6 он терпит неудачу каждый раз с одной из этих ошибок:

Ошибка При получении результатов с сервера произошла ошибка транспортного уровня. (поставщик: поставщик сеанса, ошибка: 19 - физическое соединение не используется)

Ошибка. Сеанс завершен, поскольку он приобрел слишком много блокировок. Попробуйте прочитать или изменить меньшее количество строк в одной транзакции. Серьезная ошибка произошла в текущей команде. Результаты, если таковые имеются, должны быть отброшены.

Я испробовал следующее, чтобы исправить ошибку:

  1. Проверено, что все прочитанные хранимые процедуры имеют модификатор WITH (NOLOCK)
  2. Увеличен тайм-аут в контексте инфраструктуры сущности до 5 часов
  3. Удалена новая SqlAzureExecutionStrategy которая была введена в действие, и вернула ее, чтобы использовать DefaultExecutionStrategy
  4. Удалены все транзакции, которые произошли в хранимой процедуре
  5. Убедитесь, что этот шаг в рабочей роли запущен в собственном контексте

Пример кода:

using (var dbContext = new EFEntityContext())
{
    // set the timeout to 5 hours
    var objectContext = (dbContext as IObjectContextAdapter).ObjectContext;
    objectContext.CommandTimeout = 18000; // 5 hours

    // update all active curriculums
    var result = dbContext.usp_MyLongRunningProd();

    // log the results of the operation
    Trace.TraceInformation(result);
}

Кроме того, хранимые процедуры считывают большую таблицу в курсор, проходят через нее и выполняют как анализ и изменение данных на основе каждого элемента. Мне не нужно, чтобы курсор был в транзакции любого типа, и я не использую тот, который я знаю, если только EF не делает это, и это проблема.

Популярные ответы

Я считаю, что эта статья может иметь ответ, но я не буду знать, пока моя работа не начнется сегодня. Я буду обновлять этот ответ, если он преуспеет:

http://entityframework.codeplex.com/discussions/454994

Что говорит:

В рамках работы по отказоустойчивости соединений мы изменили поведение по умолчанию некоторых API, которые могут создавать побочные эффекты для начала использования транзакций. Мы также внедрили способ отказаться от этого нового поведения для конкретных случаев, когда транзакции не поддерживаются. Например, в новых перегрузках Database.ExecuteSqlCommand передается новый параметр перечисления, который отключает транзакции.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему