成功更改存储后,EF Core dbcontext事务是否可能失败



我有一个事务,我想将一些数据保存到SQL Server数据库中,然后执行一些无法重做的操作,如发送电子邮件、发布消息。。。等

我想知道,如果上下文成功保存了数据(可以是对SaveChanges的一次或多次调用(,那么与SQL Server提供程序的EF Core事务是否有可能失败事件

using (var tran = _context.Database.BeginTransaction())
{
try
{
Behaviour behaviour = new Behaviour(request.Kind, request.Label, request.Verb, request.Units, request.Cycles);
_context.BehaviourSet.Add(behaviour);
// A- other code here that adds entities to the context 
// B- Save everything...
await _context.SaveChangesAsync(cancellationToken);
// C- Create and publish events to a store or some other non-transactional actions
// D- I wonder if this transaction can fail even if the SaveChanges is successful
tran.Commit(); 
}
catch (Exception e)
{
tran.Rollback();
// E- logging and other stuff
}
}

虽然网络连接可能会中断,或者SQL Server的服务器随时崩溃,但使用此模式时可以稍微小心一点。只要将其发生的概率降低到某个阈值以下,并制定一个操作应急计划以防发生。毕竟,没有一个系统是100%可靠的。

首先,使SaveChanges((和Commit((之间的时间保持合理的短,以降低环境故障的概率。

其次,不要使用InMemory表。它们有一个特殊的乐观并发模型,其中在提交时检查写/写冲突。这是SQL Server在提交时而不是在执行操作时强制执行约束的唯一场景。

第三,确保您的SQL Server有足够的空间用于日志文件,因为日志空间不足可能会导致您无法提交(这需要写入日志(。

第四,制定一个操作程序,以处理罕见的承诺失败情况。

是的,这是可能的。

  • 没有事务,任何SaveChanges都是它自己的事务。因此,在Save更改后,事务已提交。

  • 在tx处于活动状态的情况下,一个保存更改没有提交任何内容,因此下一个保存可能会引发异常,强制回滚整个事务。如果事务只有一个savechanges,那么tx仍然可能失败,因为提交和savechagnes不会紧接着发生。对你来说,这可能看起来很直接,但对计算机来说,这是相当长的一段时间,而且这是可能的,即计算机在两行之间的时刻发生了故障。因此,事务将不会提交,您将得到一个异常。

最新更新