【发布时间】:2022-06-29 17:28:00
【问题描述】:
我确实有一个使用 EF 核心连接到 Azure SQL 的应用程序。 我们面临弹性故障,添加 EnableRetryOnFailure() 是我配置的解决方案。
services.AddEntityFrameworkSqlServer()
.AddDbContext<jmasdbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DataContext"), sqlServerOptionsAction: sqlActions =>
{
sqlActions.EnableRetryOnFailure(
maxRetryCount: 10,
maxRetryDelay: TimeSpan.FromSeconds(5),
errorNumbersToAdd: null);
}), ServiceLifetime.Transient);
现在,当我们遇到如下 BeginTransaction 抛出错误时,这个会失败
"配置的执行策略 'SqlServerRetryingExecutionStrategy' 不支持用户启动 交易。使用返回的执行策略 'DbContext.Database.CreateExecutionStrategy()' 执行所有 事务中的操作作为可重试单元。”
我查看了 MS 文档,他们建议使用 ExecuteAsync 手动定义执行策略“https://docs.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/implement-resilient -entity-framework-core-sql-connections"
这变得很痛苦,因为我们确实有超过 25 个地方进行这些交易。
我尝试在 DbContext 级别使用自定义 ExecutionStrategy 但这没有帮助
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured && !string.IsNullOrEmpty(ConnectionString))
{
optionsBuilder.UseSqlServer(ConnectionString, options =>
{
options.ExecutionStrategy((dependencies) =>
{
return new SqlServerRetryingExecutionStrategy(dependencies, maxRetryCount: 3, maxRetryDelay: TimeSpan.FromSeconds(5), errorNumbersToAdd: new List<int> { 4060 });
});
});
}
}
有没有办法在全球范围内定义它?我们不希望每个操作都采用不同的策略,每当出现故障时,我们希望它完全回滚并从头开始。
【问题讨论】:
-
请编辑您的问题并发布代码而不是图片。无法复制图像或将图像编入索引以供搜索。
-
感谢@SvyatoslavDanyliv,我添加了代码而不是图像。
标签: sql-server asp.net-core entity-framework-core azure-sql-database