From 012e67b0e6da6eac5724a843949cda6eaa6f3037 Mon Sep 17 00:00:00 2001 From: betterroy1 Date: Fri, 15 Aug 2025 17:07:04 +0800 Subject: [PATCH] feat(filter): enable transation by attribute --- ZR.ServiceCore/Filters/TransactionFilter.cs | 40 +++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 ZR.ServiceCore/Filters/TransactionFilter.cs diff --git a/ZR.ServiceCore/Filters/TransactionFilter.cs b/ZR.ServiceCore/Filters/TransactionFilter.cs new file mode 100644 index 00000000..6ac04aea --- /dev/null +++ b/ZR.ServiceCore/Filters/TransactionFilter.cs @@ -0,0 +1,40 @@ +using Microsoft.AspNetCore.Mvc.Filters; +using SqlSugar.IOC; + +namespace ZR.ServiceCore.Filters; + +/// +/// 自动事务管理:在 Action 执行前自动开启数据库事务(业务代码与事务功能解耦) +/// 事务提交与回滚: +/// 当 Action 执行成功(无异常或异常已处理)时,自动提交事务 +/// 当 Action 执行出现未处理异常时,自动回滚事务 +/// 异常安全处理:捕获所有异常并确保事务回滚后重新抛出异常 +/// +public class TransactionFilter : ActionFilterAttribute +{ + private readonly SqlSugarScope _db = DbScoped.SugarScope; + + public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) + { + try + { + await _db.BeginTranAsync(); + + var result = await next(); + + if (result.Exception == null || result.ExceptionHandled) + { + await _db.CommitTranAsync(); + } + else + { + await _db.RollbackTranAsync(); + } + } + catch (Exception) + { + await _db.RollbackTranAsync(); + throw; + } + } +} \ No newline at end of file -- Gitee