c# - 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 函数,我们是否有等效的异步方法。
解决方案
推荐阅读
- docker - 使用 JDBC 输入插件在 Docker 上的 Logstash 不会从 SQL Server 获取所有行
- flutter - 如何突出显示我在字符串中搜索的确切单词,而不仅仅是字符串的开头?
- flutter - 如何实时获取文档长度
- javascript - Reactjs 从获取请求中返回一个对象
- javascript - Nginx 正在尝试打开文件而不是重定向到代理
- python - _joint_log_likelihood 给我错误的值
- sql - 如何按日期获取最后一件商品的价格
- python-3.x - 定期执行功能而不停止其他操作
- r - 使用 R 从 PDF 表单到数据框的文本挖掘
- r - 如果 r 中出现错误,则转到 lapply() 的下一次迭代