BeginTransaction() 与 BeginTransactionAsync() 对性能有何影响

Rap*_*lva 3 c# asp.net-web-api2 entity-framework-core asp.net-core

我有一个原子事务的实现,其中在异步 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();
Run Code Online (Sandbox Code Playgroud)

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

但是,我应该异步执行吗?BeginTransaction() 与 BeginTransactionAsync() 对性能有何影响

Svy*_*liv 7

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

如果您真的关心性能和服务器资源,请重写您的代码以使用异步版本。并且不要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();
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 这将隐式调用“transaction.Dispose()”,这是一个同步阻塞操作。而是使用“await using”,它将调用“await transaction.DisposeAsync()”。 (7认同)
  • 有人肯定会大吃一惊……但是异步调用与多线程是正交的。事实上,异步调用都是为了最大限度地利用*一个*线程,让其在等待 I/O 操作(主要)完成时执行其他工作而不阻塞线程,而不是使用多个线程。框架“可能”有时会在与启动线程不同的线程上恢复异步操作,但这并不重要,而且不一定是不可取的,因为有许多问题可能会影响执行此操作的性能,例如 CPU 缓存失效。 (2认同)