在出现故障时自动重试的执行策略需要能够回滚失败的重试块中的每个操作。 启用重试后,通过 EF Core 执行的每个操作都将成为其自身的可重试操作。 也就是说,如果出现暂时性故障,每个查询和对 SaveChanges() 的每次调用都将作为一个单元进行重试。
但是,如果你的代码使用 BeginTransaction() 启动事务,则你将定义自己的操作组(这些操作需要被视为一个单元),并且如果发生故障,将需要回滚事务内的所有内容。
using (var db = new BloggingContext())
{
var strategy = db.Database.CreateExecutionStrategy();
strategy.Execute(() =>
{
using (var context = new BloggingContext())
{
using (var transaction = context.Database.BeginTransaction())
{
context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
context.SaveChanges();
context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/visualstudio" });
context.SaveChanges();
transaction.Commit();
}
}
});
}Code language: JavaScript (javascript)
通过策略 可以使得当出现异常的时候 自动回滚 所以我们这里 没有写回滚部分代码。
Previous: 创建、读取、更新和删除
Next: 实体类型和表映射