实体框架中的异步提交?

时间:2017-05-19 17:51:11

标签: 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();
}

我想让.Commit异步,但我在DbContextTransaction

中看不到合适的API

1 个答案:

答案 0 :(得分:1)

在尝试确定同一件事时,我浏览了DbContext.SaveChangesAsync()的EF6源代码,以了解EF如何处理异步调用中隐式事务的提交。

与伊万(Ivan)关于上述问题的评论相同,EF或System.Data中没有用于异步提交的机制。

ObjectContext.ExecuteInTransactionAsync(为SaveChangesAsync处理事务的地方)中,异步更新例程仅包装在EntityConnection.BeginTransaction和同步DbTransaction.Commit中。如果有一个鲜为人知的异步异步Commit,我认为这里将使用它。

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