当我们启动多个异步实体框架查询时会发生什么并行运行它们?
它们在物理上是并行执行的吗?它们是由实体框架序列化的吗?这是不支持的吗?它会导致异常吗?
public async Task QueryDatabase()
{
using (var context = new MyDbContext())
{
Task task1 = context.SomeTable1.ToListAsync();
Task task2 = context.SomeTable2.ToListAsync();
await Task.WhenAll(task1, task2);
}
}
根据版本6的规格.
这应该抛出一个DbConcurrencyException
异常说
在前一个操作之前,第二个操作在此上下文中启动
异步操作完成。使用“await”确保任何
异步操作在调用另一个方法之前已完成
在此背景下。不保证任何实例成员都是线程
安全的。
EF will detect如果开发人员尝试同时执行两个异步操作并扔.
From 项目的 codeplex 页面:
启用数据库操作的异步执行实际上是
正交于在同一上下文上启用并发执行。在
服务器场景的特殊情况,使用并发访问可以
对可扩展性产生负面影响,因为这意味着为了
处理单个请求,您将旋转任意数量的请求
不同线程的。所有线程都会竞争资源,例如
作为服务其他并发所需的其他线程的内存
要求。
实体框架核心也不支持这种场景.
EF Core 不支持在同一上下文实例上运行多个并行操作。您应该始终等待操作完成后再开始下一个操作。这通常是通过在每个异步操作上使用await关键字来完成的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)