Как избежать блокировки базы данных в Entity Framework 4 при выполнении большого количества обновлений

Этот вопрос касается наилучшей практики обработки множества вставок или обновлений с помощью Microsoft Entity Framework. Проблема в том, что мы написали долго работающую программу, которая извлекает тысячи записей из базы данных, а затем обновляет одно поле в каждой из этих записей, одну за другой. К нашему большому разочарованию, мы поняли, что каждая из этих обновленных записей была заблокирована на время, в течение которого ObjectContext не был удален. Ниже приведен псевдокод (на самом деле не работает), чтобы проиллюстрировать:

using(ObjectContext context = new ObjectContext())
{

    var myRecords = context.CreateObjectSet<MyType>().AsQueryable();

    foreach(var record in myRecords)
    {
       record.MyField = "updated!";
       context.SaveChanges();

       //--do something really slow like call an external web service
   }
}

Проблема в том, что нам нужно выполнять много обновлений без учета транзакций. Мы были удивлены, узнав, что вызов context.SaveChanges () фактически создает блокировку для записей и не снимает ее, пока ObjectContext не будет удален. Мы особенно НЕ хотим блокировать записи в базе данных, поскольку это система с высоким трафиком, и программа потенциально может работать часами.

Итак, вопрос: каков оптимальный способ сделать много обновлений в Microsoft Entity Framework 4 БЕЗ выполнения их всех в одной длинной транзакции, которая блокирует БД? Мы надеемся, что ответ заключается не в создании нового ObjectContext для каждого отдельного обновления ...

15
задан JasCav 16 March 2011 в 19:44
поделиться