如何解决try { 开始事务,savechanges } catch { 回滚,开始另一个事务,savechanges } EF 核心
我有一个名为 _context
的数据库,我想在名为“workers”的表中插入一些“worker”。帮助我实现这一目标的功能使用后台服务库每两个小时运行一次。我需要保留发生错误时发生的事情的历史记录,因此我设置了一个名为“Log”的表,该表将填充每个错误或成功。
所以我尝试:
IDbContextTransaction transac = null;
try
{
//...
//code here with _context.workers.toListAsync() etc..
//...
foreach (var worker in WorkerList)
{
transac = _context.Database.BeginTransaction();
_context.workers.Add(worker);
await _context.SaveChangesAsync();
transac.Commit();
//LogSuccess
Log logSuccess = "Worker successfully added";
_context.Log.Add(logSuccess);
await _context.SaveChangesAsync();
}
}
catch(Exception ex)
{
transac.Rollback();
//LogErreur
Log logError = ex.message;
transac = _context.Database.BeginTransaction();
_context.Log.Add(logError);
await _context.SaveChangesAsync();
}
我的问题如下:
当 _context.SaveChangesAsync()
上发生错误时(在添加工作器之后),它进入捕获并开始另一个事务。但是当 _context.SaveChangesAsync
出现时,程序抛出的错误与之前第一个 _context.SaveChangesAsync()
抛出的错误相同。对我来说,transac.rollback()
应该“擦除”之前的交易。
解决方法
SaveChanges 中的失败不会清除更改跟踪器,因此对 SaveChanges 的后续调用将尝试再次保存所有更改。这使您能够重试暂时性错误或在重试之前修改挂起的更改。
使用新的 DbContext 或调用 ChangeTracker.Clear。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。