实体框架中的异步提交?

psl*_*sla 6 entity-framework transactions

如何在实体框架中异步提交事务?

using (var transaction = this.db.Database.BeginTransaction())
{
    this.db.DoSomething();
    await this.db.SaveChangesAsync().ConfigureAwait(false);

    // note .Commit isn't async but it involves network i/o
    transaction.Commit();
}
Run Code Online (Sandbox Code Playgroud)

我想让 .Commit 异步,但我在DbContextTransaction 中没有看到合适的 API

Mik*_*sen 3

为了确定同样的事情,我浏览了 EF6 源代码,了解DbContext.SaveChangesAsync()EF 如何处理异步调用上隐式事务的提交。

与 Ivan 对上述问题的评论一致,EF 或System.Data.

ObjectContext.ExecuteInTransactionAsync处理事务的地方SaveChangesAsync,异步更新例程被简单地包装在EntityConnection.BeginTransaction同步例程中DbTransaction.Commit。如果有一个鲜为人知的异步 asynchronous Commit,我会假设它会在这里使用。

这似乎是异步产品中的一个漏洞,因为System.Data大型事务可能需要很长时间才能提交,从而占用进程中的线程。因此,具有大量数据库更新活动的服务器应用程序可能会失去异步代码的很多好处。