当我们启动多个异步实体框架查询并并行运行它们时,会发生什么?
它们是否在物理上并行执行?它们是否由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);
}
}
这应该抛出一个DbConcurrencyException
异常的说法
在先前的异步操作完成之前,第二操作在此上下文上开始。使用“ await”来确保在此上下文上调用另一个方法之前,所有异步操作都已完成。不保证任何实例成员都是线程安全的。
EF将检测开发人员是否尝试一次执行两个异步操作并抛出。
从项目的代码库页面:
启用数据库操作的异步执行实际上与在同一上下文中启用并发执行正交。在服务器方案的特定情况下,使用并发访问可能会对可伸缩性产生负面影响,因为这意味着为了处理单个请求,您将旋转任意数量的不同线程。所有线程都将与服务器其他并发请求所需的其他线程竞争资源(例如内存)。
实体框架核心也不支持这种情况。
EF Core不支持在同一上下文实例上运行多个并行操作。在开始下一个操作之前,您应始终等待操作完成。通常,通过在每个异步操作上使用await关键字来完成此操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句