首页 > 其他分享 >Filter 筛选器之 自定义一个启动事务的 TransactionScopeFilter

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

时间:2022-08-13 23:04:43浏览次数:82  
标签:自定义 写入 Filter TransactionScopeAsyncFlowOption context var 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 非 即可 标识 为开启)

标签:自定义,写入,Filter,TransactionScopeAsyncFlowOption,context,var,TransactionScopeFilter
From: https://www.cnblogs.com/Bo-H/p/16584454.html

相关文章

  • djnago-filter用法
    django-filter用法集成drf自定义filter文件内fromdjango_filtersimportrest_frameworkasrs_filtersfrom.modelsimport*classTestFilter(rs_filters.Filter......
  • vue学习之------过滤器Filters
    注:Vue3中已废弃filter过滤器常用于文本的格式化例如:helloworld>>Hello World过滤器可以用在两个地方:{{插值表达式}}和v-bind属性绑定 过滤器定义: ......
  • 自定义组件⑦插槽-微信小程序开发(二十四)
    1.什么是插槽在自定义组件的wxml结构中,可以提供一个节点(插槽),用于承载组件使用者提供的wxml结构。2.单个插槽在小程序中,默认每个自定义组件中只允许使用一个......
  • 自定义组件⑤纯数据字段-微信小程序开发(二十二)
    1.什么是纯数据字段概念:纯数据字段指的是那些不用于界面渲染的data字段。应用场景:例如有些情况下,某些data中的字段既不会展示在界面上,也不会传递给其他组件,仅仅在当......
  • Java中list集合自定义排序-2022新项目
    一、业务场景为了加快首页数据查询的效率,因此将首页查询的数据大多数都放在了缓存中,包括各种list集合数据。对这些从缓存中获取的数据做了一个兜底处理,如果从缓存中......
  • 自定义组件②样式-微信小程序开发(十九)
    1.组件样式隔离默认情况下,自定义组件的样式只对当前组件生效,不会影响到组件之外的UI结构,如图所示:⚫组件A的样式不会影响组件C的样式⚫组件A的样式不会影响小......