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

Поддерживает ли Entity Framework параллельные асинхронные запросы?

Что происходит, когда мы запускаем несколько запросов async Entity Framework и запускаем их параллельно?

Они физически выполняются параллельно? Являются ли они сериализованы Entity Framework? Это неподдерживается? Это приводит к исключению?

public async Task QueryDatabase()
{
    using (var context = new MyDbContext())
    {
        Task task1 = context.SomeTable1.ToListAsync();
        Task task2 = context.SomeTable2.ToListAsync();

        await Task.WhenAll(task1, task2);
    }
}
4b9b3361

Ответ 1

Это не поддерживается в соответствии со спецификациями версии 6.

Это должно вызывать исключение DbConcurrencyException, говорящее

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

EF будет обнаруживать, если разработчик попытается выполнить две операции async за один раз и бросить.

От страница с кодом в проекте:

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

Ответ 2

Просто примечание, как упоминалось ken2k, это недопустимо при использовании Entity Framework с MS SQL Server. Однако, если вы используете Entity Framework с Oracle, это разрешено.