Use IExecutionStrategy

This commit is contained in:
2025-11-03 21:00:52 +09:00
parent 68b26d8cf5
commit 2dcaf45322
3 changed files with 107 additions and 88 deletions

View File

@ -1,5 +1,6 @@
using Hcs.WebApp.Data.Hcs; using Hcs.WebApp.Data.Hcs;
using Hcs.WebApp.Services; using Hcs.WebApp.Services;
using Microsoft.EntityFrameworkCore;
namespace Hcs.WebApp.BackgroundServices.CampaignManagers namespace Hcs.WebApp.BackgroundServices.CampaignManagers
{ {
@ -41,9 +42,12 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
private async Task DoStartStepAsync() private async Task DoStartStepAsync()
{ {
IEnumerable<Operation> operations; IEnumerable<Operation>? operations = null;
using var context = HeadquartersService.GetNewContext(); using var context = HeadquartersService.GetNewContext();
var executionStrategy = context.Database.CreateExecutionStrategy();
await executionStrategy.ExecuteAsync(async () =>
{
using var transaction = await context.Database.BeginTransactionAsync(); using var transaction = await context.Database.BeginTransactionAsync();
try try
{ {
@ -64,6 +68,7 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
throw; throw;
} }
});
if (operations != null) if (operations != null)
{ {
@ -98,6 +103,9 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
if (resultWaitState.HasCampaignOperation(campaign.Id)) return; if (resultWaitState.HasCampaignOperation(campaign.Id)) return;
using var context = HeadquartersService.GetNewContext(); using var context = HeadquartersService.GetNewContext();
var executionStrategy = context.Database.CreateExecutionStrategy();
await executionStrategy.ExecuteAsync(async () =>
{
using var transaction = await context.Database.BeginTransactionAsync(); using var transaction = await context.Database.BeginTransactionAsync();
try try
{ {
@ -114,6 +122,7 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
throw; throw;
} }
});
State = IManager.ManagerState.Ended; State = IManager.ManagerState.Ended;
} }

View File

@ -1,6 +1,7 @@
using Hcs.Broker; using Hcs.Broker;
using Hcs.WebApp.Data.Hcs; using Hcs.WebApp.Data.Hcs;
using Hcs.WebApp.Services; using Hcs.WebApp.Services;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Hcs.WebApp.BackgroundServices.ResultGetters.NsiCommon namespace Hcs.WebApp.BackgroundServices.ResultGetters.NsiCommon
@ -21,6 +22,9 @@ namespace Hcs.WebApp.BackgroundServices.ResultGetters.NsiCommon
var registryService = scope.ServiceProvider.GetRequiredService<RegistryService>(); var registryService = scope.ServiceProvider.GetRequiredService<RegistryService>();
using var context = headquartersService.GetNewContext(); using var context = headquartersService.GetNewContext();
var executionStrategy = context.Database.CreateExecutionStrategy();
await executionStrategy.ExecuteAsync(async () =>
{
using var transaction = await context.Database.BeginTransactionAsync(); using var transaction = await context.Database.BeginTransactionAsync();
try try
{ {
@ -47,10 +51,11 @@ namespace Hcs.WebApp.BackgroundServices.ResultGetters.NsiCommon
} }
catch catch
{ {
transaction?.Rollback(); await transaction.RollbackAsync();
throw; throw;
} }
});
return true; return true;
} }

View File

@ -44,6 +44,9 @@ namespace Hcs.WebApp.Services
public async Task UpdateUserAsync(string userId, string roleId, string password) public async Task UpdateUserAsync(string userId, string roleId, string password)
{ {
using var context = factory.CreateDbContext(); using var context = factory.CreateDbContext();
var executionStrategy = context.Database.CreateExecutionStrategy();
await executionStrategy.ExecuteAsync(async () =>
{
using var transaction = await context.Database.BeginTransactionAsync(); using var transaction = await context.Database.BeginTransactionAsync();
try try
{ {
@ -79,14 +82,16 @@ namespace Hcs.WebApp.Services
} }
await context.SaveChangesAsync(); await context.SaveChangesAsync();
await transaction.CommitAsync();
} }
catch (Exception) catch
{ {
await transaction.RollbackAsync(); await transaction.RollbackAsync();
throw; throw;
} }
await transaction.CommitAsync(); });
} }
public async Task<IdentityResult> DeleteUserAsync(string userId) public async Task<IdentityResult> DeleteUserAsync(string userId)