Используйте опцию IsolationLevel.ReadUncommited только для одного запроса в DbContext. - PullRequest
1 голос
/ 25 сентября 2019

В базовом проекте .NET я использую EntityFramework, и у меня есть DbContext (shopContext), внедренный в мой репозиторий классов.У меня следующий запрос:

var res = shopContext.Orders.Where(x => x.Status == 1).Sum(p => p.Total);

Иногда таблица «Заказы» выполняет задачи обслуживания, и таблица блокируется.Для этого запроса я не могу дождаться выполнения задач обслуживания, и мне нужен доступ к таблице с параметром IsolationLevel.ReadUncommited в транзакции:

using (var transaction = mutuaContext.Database.BeginTransaction(IsolationLevel.ReadUncommitted))
{
    var res = shopContext.Orders.Where(x => x.Status == 1).Sum(p => p.Total);
}

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

Почему следующие запросы не ожидают разблокировки таблицы?

Примермоего кода:

using (var transaction = mutuaContext.Database.BeginTransaction(IsolationLevel.ReadUncommitted))
{
    var res = shopContext.Orders.Where(x => x.Status == 1).Sum(p => p.Total); // this code would be executed
}

var total = shopContext.Orders.Where(x => x.Status == 0).Sum(p => p.Total); // this code would NOT be executed but is executed

Я не понимаю, как контекст получает конфигурацию транзакции.Я хотел бы, чтобы кто-то объяснил мне это.

Я пытался позвонить transaction.Commit() после первого запроса, но все еще не работал.

1 Ответ

1 голос
/ 25 сентября 2019

Вы можете использовать необработанный SQL-запрос (также существует аналогичный SqlQuery() метод для EF6) и указать with (nolock) табличную подсказку.Примерно так:

var res = shopContext.Orders.FromSqlRaw("select sum(Total) from dbo.Orders with (nolock) where Status = 1").ToList();

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

UPD: Для EF Core 2.2 синтаксис немного другой:

var res = shopContext.Orders.FromSql("select * from Orders with(nolock)")
  .Where(x => x.Status == 1).Sum(p => p.Total);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...