using Microsoft.Extensions.Logging;
namespace KH.WMS.Core.Database.UnitOfWorks;
///
/// UnitOfWork 扩展方法
///
public static class UnitOfWorkExtensions
{
///
/// 创建事务作用域,自动管理事务生命周期
///
/// 工作单元
/// 日志记录器
/// 事务隔离级别
/// 事务作用域
public static async Task BeginTransactionScopeAsync(
this IUnitOfWork unitOfWork,
ILogger logger,
System.Data.IsolationLevel isolationLevel = System.Data.IsolationLevel.ReadCommitted)
{
await unitOfWork.BeginTransactionAsync(isolationLevel);
return new TransactionScopeWrapper(unitOfWork, logger);
}
///
/// 在事务作用域中执行操作
///
/// 工作单元
/// 日志记录器
/// 要执行的操作
/// 事务隔离级别
public static async Task ExecuteInTransactionAsync(
this IUnitOfWork unitOfWork,
ILogger logger,
Func action,
System.Data.IsolationLevel isolationLevel = System.Data.IsolationLevel.ReadCommitted)
{
await using var scope = await unitOfWork.BeginTransactionScopeAsync(logger, isolationLevel);
try
{
await action();
await scope.CommitAsync();
}
catch
{
await scope.RollbackAsync();
throw;
}
}
///
/// 在事务作用域中执行操作(带返回值)
///
/// 返回值类型
/// 工作单元
/// 日志记录器
/// 要执行的操作
/// 事务隔离级别
/// 操作结果
public static async Task ExecuteInTransactionAsync(
this IUnitOfWork unitOfWork,
ILogger logger,
Func> action,
System.Data.IsolationLevel isolationLevel = System.Data.IsolationLevel.ReadCommitted)
{
await using var scope = await unitOfWork.BeginTransactionScopeAsync(logger, isolationLevel);
try
{
var result = await action();
await scope.CommitAsync();
return result;
}
catch
{
await scope.RollbackAsync();
throw;
}
}
}
///
/// 事务作用域接口
///
public interface ITransactionScope : IAsyncDisposable
{
///
/// 提交事务
///
Task CommitAsync();
///
/// 回滚事务
///
Task RollbackAsync();
///
/// 事务是否已提交
///
bool IsCommitted { get; }
}
///
/// 事务作用域包装器
///
public class TransactionScopeWrapper : ITransactionScope
{
private readonly IUnitOfWork _unitOfWork;
private readonly ILogger _logger;
private bool _disposed;
private bool _committed;
public TransactionScopeWrapper(IUnitOfWork unitOfWork, ILogger logger)
{
_unitOfWork = unitOfWork;
_logger = logger;
}
public bool IsCommitted => _committed;
public async Task CommitAsync()
{
if (!_committed)
{
await _unitOfWork.CommitAsync();
_committed = true;
_logger.LogDebug("事务作用域已提交");
}
}
public async Task RollbackAsync()
{
if (!_committed)
{
await _unitOfWork.RollbackAsync();
_committed = true;
_logger.LogDebug("事务作用域已回滚");
}
}
public async ValueTask DisposeAsync()
{
if (!_disposed)
{
if (!_committed)
{
_logger.LogWarning("事务作用域释放时未提交,自动回滚");
try
{
await _unitOfWork.RollbackAsync();
}
catch
{
// 忽略 dispose 时的异常
}
}
_disposed = true;
}
}
}