CloudBuilder/CloudBuilder.Core/DatabaseAccessor/UnitOfWorkAttribute.cs
owenchen 13d3047102 ow
2026-05-19 09:52:24 +08:00

105 lines
3.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using CloudBuilder.Core.Service;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;
namespace CloudBuilder.Core.DatabaseAccessor
{
/*
事务范围TransactionScopeOption.RequiresNew 管理的是分布式事务,
TransactionScopeOption.Required但对于单个数据库连接通常不需要分布式事务。
OnActionExecutionAsync 是 ASP.NET Core 中异步的 Action 过滤器执行方法。
// OnActionExecuting: Action 执行前
[开始事务]
[Action 方法执行]
// OnActionExecuted: Action 执行后(无论是否异常)
[检查异常]
//Controller对象不抛出异常返回的是异常对象ValidatedException、ServiceErrorException方便前端信息统一处理
[提交或回滚事务]
*/
[AttributeUsage(AttributeTargets.Method)]
public class UnitOfWorkAttribute : ActionFilterAttribute
{
private TransactionScope _transactionScope;
public override void OnActionExecuting(ActionExecutingContext context)
{
_transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadCommitted,
Timeout = TransactionManager.MaximumTimeout
});
base.OnActionExecuting(context);
}
//public override void OnActionExecuting(ActionExecutingContext context)
//{
// // 正确:单机数据库事务(不是分布式)
// _transactionScope = new TransactionScope(
// TransactionScopeOption.Required,
// new TransactionOptions
// {
// IsolationLevel = IsolationLevel.ReadCommitted
// },
// TransactionScopeAsyncFlowOption.Enabled); // 必须加这个
// base.OnActionExecuting(context);
//}
public override void OnActionExecuted(ActionExecutedContext context)
{
if (_transactionScope == null)
{
base.OnActionExecuted(context);
return;
}
bool needRollback = false;
try
{
// ==============================================
// 核心逻辑:判断返回值是不是异常对象
// ==============================================
if (context.Result is ObjectResult objectResult)
{
var value = objectResult.Value;
if (value != null)
{
// 只要是这两个异常 → 必须回滚
if (value is ValidatedException || value is ServiceErrorException)
{
needRollback = true;
}
}
}
// 如果没有异常,才提交
if (!needRollback)
{
//必须要有 SaveChanges() 调用,否则数据只会停留在内存中,不会真正保存到数据库。
_transactionScope.Complete();
}
}
finally
{
// 不 Complete() 就是自动回滚
_transactionScope.Dispose();
}
base.OnActionExecuted(context);
}
}
}