Filter 筛选器(三)之 自定义一个启动事务的 TransactionScopeFilter

如果一个方法内有多个写入操作,比如 写入A表,然后用A表的自增id 去写入B表,假如A表写入成功,但B表因为某种原因写入失败!(这就导致A表写入了脏数据)

这时候 我们可以自定义 一个Filter 进行拦截判断是否需要这个方法开启事务
using var txScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled); // TransactionScopeAsyncFlowOption.Enabled是开启异步的时候必须要传入这个参数

builder.Services.Configure<MvcOptions>(options =>
{
    options.Filters.Add<TransactionScopeFilter>();
});
 public class TransactionScopeFilter : IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
			bool hasNotTransactionalAttribute = false;
			if (context.ActionDescriptor is ControllerActionDescriptor)
			{
				var actionDesc = (ControllerActionDescriptor)context.ActionDescriptor;
				hasNotTransactionalAttribute = actionDesc.MethodInfo
					.IsDefined(typeof(NotTransactionalAttribute)); //判断Action 上是否有NotTransactionalAttribute 如果有就跳过 没有反之
			}
			if (hasNotTransactionalAttribute)  //判断方法上是否 [NotTransactional] 
			{
				await next();   //不开启事务 直接执行下一个
				return;
			}
			using var txScope =
					new TransactionScope(TransactionScopeAsyncFlowOption.Enabled);  // C# 10的写法 只能在VS 2022
			var result = await next();
			if (result.Exception == null)
			{
				txScope.Complete();
			}
		}
    }

在不需要验证的方法上标识 [NotTransactional] (也可以更改上面的代码 if 非 即可 标识 为开启)

posted @ 2022-08-13 22:46  Bo-Hong  阅读(83)  评论(0编辑  收藏  举报