feat: ajustes
This commit is contained in:
@@ -1,9 +0,0 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Shop.Core.Interfaces;
|
||||
|
||||
public interface IDataBaseTransaction
|
||||
{
|
||||
Task ExecuteAsync(Func<Task> action);
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Shop.Core.Interfaces;
|
||||
|
||||
public interface ITransaction
|
||||
{
|
||||
Task ExecuteAsync(Func<Task> action, CancellationToken cancellationToken = default);
|
||||
}
|
||||
@@ -7,9 +7,9 @@ namespace Shop.Infrastructure.Behaviors;
|
||||
|
||||
public class TransactionBehaviour<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IRequest<TResponse>
|
||||
{
|
||||
private readonly IDataBaseTransaction _dbTransaction;
|
||||
private readonly ITransaction _dbTransaction;
|
||||
|
||||
public TransactionBehaviour(IDataBaseTransaction dbTransaction) => _dbTransaction = dbTransaction;
|
||||
public TransactionBehaviour(ITransaction dbTransaction) => _dbTransaction = dbTransaction;
|
||||
|
||||
public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
|
||||
{
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging;
|
||||
@@ -7,7 +8,7 @@ using Shop.Core.Interfaces;
|
||||
|
||||
namespace Shop.Infrastructure.Data;
|
||||
|
||||
public class ShopContextTransaction : IDataBaseTransaction
|
||||
public class ShopContextTransaction : ITransaction
|
||||
{
|
||||
private readonly ShopContext _dbContext;
|
||||
private readonly ILogger<ShopContextTransaction> _logger;
|
||||
@@ -18,13 +19,16 @@ public class ShopContextTransaction : IDataBaseTransaction
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task ExecuteAsync(Func<Task> action)
|
||||
public async Task ExecuteAsync(Func<Task> action, CancellationToken cancellationToken = default)
|
||||
{
|
||||
if (action == null)
|
||||
throw new ArgumentNullException(nameof(action));
|
||||
|
||||
var strategy = _dbContext.Database.CreateExecutionStrategy();
|
||||
|
||||
await strategy.ExecuteAsync(async () =>
|
||||
{
|
||||
var transaction = await _dbContext.Database.BeginTransactionAsync(IsolationLevel.ReadCommitted);
|
||||
var transaction = await _dbContext.Database.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken);
|
||||
|
||||
_logger.LogInformation("----- Begin transaction {TransactionId}", transaction.TransactionId);
|
||||
|
||||
@@ -32,9 +36,9 @@ public class ShopContextTransaction : IDataBaseTransaction
|
||||
|
||||
try
|
||||
{
|
||||
var rowsAffected = await _dbContext.SaveChangesAsync();
|
||||
var rowsAffected = await _dbContext.SaveChangesAsync(cancellationToken);
|
||||
|
||||
await transaction.CommitAsync();
|
||||
await transaction.CommitAsync(cancellationToken);
|
||||
|
||||
_logger.LogInformation("----- Commit transaction {TransactionId}, row(s) affected {RowsAffected}", transaction.TransactionId, rowsAffected);
|
||||
}
|
||||
@@ -42,7 +46,7 @@ public class ShopContextTransaction : IDataBaseTransaction
|
||||
{
|
||||
_logger.LogError(ex, "An unexpected exception occurred while committing the transaction {TransactionId}", transaction.TransactionId);
|
||||
|
||||
await transaction.RollbackAsync();
|
||||
await transaction.RollbackAsync(cancellationToken);
|
||||
|
||||
throw;
|
||||
}
|
||||
@@ -52,4 +56,4 @@ public class ShopContextTransaction : IDataBaseTransaction
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user