【问题标题】:What are the performance implications of BeginTransaction() vs BeginTransactionAsync()BeginTransaction() 与 BeginTransactionAsync() 的性能影响是什么
【发布时间】:2021-02-08 19:09:03
【问题描述】:

我有一个原子事务的实现,其中许多上下文在异步 HTTP POST 方法中被更新。

在事务实施之前,我正在异步操作我的上下文 例如(await _context.Foo.AddAsync(trade);await _context.SaveChangesAsync();

在了解了转换的必要性并看到了许多同步示例之后,我决定同步实现它们:

using (var transaction = _context.Database.BeginTransaction())
            {
                //_context.Database.Log = Console.WriteLine();

                try
                {
                    _context.Foo.Add(foo);
                    _context.SaveChanges();

                    _context.TradeItems.AddRange(new List<Bar>{});
                    _context.SaveChanges();
                    
                    transaction.Commit();

由于原子性对我来说是一个优先事项,我可以这样做。

但是,我应该改为异步吗? BeginTransaction() 与 BeginTransactionAsync() 的性能影响是什么

【问题讨论】:

  • 基本上,与任何异步一样:当后端请求的服务工作(=创建事务)时,等待结果的线程可以做其他工作。跨度>

标签: c# asp.net-core entity-framework-core asp.net-web-api2


【解决方案1】:

引入了异步函数版本以重用“等待”操作完成的线程。如果您的应用程序有很多同时请求 - 异步调用是一个好处。

如果您真的关心性能和服务器资源,请重写您的代码以使用异步版本。并且不要在每次操作后调用SaveChanges

using (var transaction = await _context.Database.BeginTransactionAsync())
{
    try
    {
        _context.Foo.Add(foo);
        _context.TradeItems.AddRange(new List<Bar>{});

        await _context.SaveChangesAsync();
        
        await transaction.CommitAsync();
    }

AddAsync 只需要您在需要数据库请求的实体中生成特殊值。

【讨论】:

  • +1 用于每次操作提示后的 AddAsync 和 SaveChanges。我对上下文的理解是,每个 DbSet 都是不同的,显然情况并非如此。
  • 这将隐式调用transaction.Dispose(),这是一个同步阻塞操作。而是使用await using,它将调用await transaction.DisposeAsync()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 2014-09-09
  • 2015-12-03
  • 2010-09-22
  • 2014-07-14
  • 1970-01-01
  • 2017-01-17
相关资源
最近更新 更多