Подтвердить что ты не робот

Структура Entity Framework и уровень изоляции транзакций

Я использую Entity Framework 4.0. Теперь мне нужно ограничить доступ к таблице во время чтения или записи на нее. Вероятно, это касается уровня изоляции транзакций.

Как это сделать?

Обновление

вот что я

using (var db = new MyDb())
{
    using (TransactionScope scope = new TransactionScope())
    {
        var item = db.MyItems.Single(x => x.Id == 5);
        item.Price = 12;
        db.SaveChanges();
        scope.Complete(); 
    }
}

Однако, когда я помещаю точку останова в любую строку внутри using (TransactionScope scope, и когда я останавливаюсь, я перехожу к Sql Server Management Studio и делаю запрос выбора (или даже обновление!) из таблицы, которая использует внутри транзакции я почему-то не получаю ошибку. Но почему? Он не должен позволять мне читать данные во время выполнения транзакции.

4b9b3361

Ответ 1

По умолчанию транзакция имеет IsolationLevel Serializable. Сериализуемый - самый высокий уровень. Для этого требуется, чтобы транзакция завершилась до того, как любая другая транзакция разрешила работать с данными.

Он имеет следующие ограничения:

  • Заявления не могут читать данные, которые были изменены, но еще не были совершенные другими транзакциями.
  • Никакие другие транзакции не могут изменять данные, которые были прочитаны текущей транзакцией, до текущей транзакция завершена.
  • Другие транзакции не могут вставлять новые строки с ключевые значения, которые попадают в диапазон ключей, считываемых любыми в текущей транзакции до текущей транзакции завершается.

Это отличное сообщение в блоге, в котором объясняется, как использовать транзакции с инфраструктурой Entity Framework: Примеры области транзакций Entity Framework

UPDATE

В Entity Framework 6 по умолчанию IsolationLevel изменен на READ_COMMITTED_SNAPSHOT для баз данных, созданных с использованием Code First, что потенциально позволяет увеличить масштабируемость и уменьшить количество тупиков. Посмотрите будущую спецификацию EF 6 на codeplex