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 非 即可 标识 为开启)
标签:自定义,写入,next,Filter,TransactionScopeAsyncFlowOption,context,var,TransactionScopeF 来源: https://www.cnblogs.com/Bo-H/p/16584454.html