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

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

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

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

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

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

  1. Проверено, что все чтения хранимых процедур имеют модификатор WITH (NOLOCK)
  2. Увеличен тайм-аут контекста Entity Framework до 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 не делает его, и это проблема.


person CodeGrue    schedule 25.11.2013    source источник


Ответы (1)


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

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

Что говорит:

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

person CodeGrue    schedule 25.11.2013