首页 > 解决方案 > EfCore 中的数据库事务

问题描述

我是 C# 的新手。我想为以下代码添加事务支持,但我对它是否已经在使用事务感到困惑,因为我们调用了 commitAsync。加上它不使用 SaveChangesAsync,我们不需要这个吗?调用 crud 方法并在没有保存更改的情况下进行提交是否足够?

public async Task<Unit> Handle(UserCommand command, CancellationToken token)
{
   var user = _mapper.Map<User>(command);
   _context.User.Add(user)
   await _context.CommitAsync();
   return Unit.Value;
}

这是我手头的东西,这样可以吗还是有更好的方法来做到这一点?

public async Task<Unit> Handle(UserCommand command, CancellationToken token)
        {
            using var transaction = _context.Database.BeginTransaction();

            try {
                // adding, removing, updating...
                var user = _mapper.Map<User>(command);
                await _context.User.AddAsync(user)
                await _context.SaveChangesAsync(token); //can we skip this stmt and jump to commit?
                await transaction.CommitAsync();
                
            }
            catch {
                await transaction.RollbackAsync();  //do I need this or this automatically handled on fail?
                throw;
            }
            return Unit.Value;
        }

还有一个问题是在这种情况下使用同步或异步版本的 BeginTransaction 更好吗?仅供参考,异步版本不包含 Commit 和 RollbackAsync 函数,我们是否有等效的异步方法。

标签: c#databaseentity-framework.net-core

解决方案


推荐阅读